Java之递归算法的理解与Demo(包含return的坑)
在平时的工作或者面试中,大家一说到“递归”,我们会想到“自己调自己”,确实,程序调用自身的编程技巧称为递归(recursion)。但是在真正编写递归程序的时候一定要具备三个条件:
1.终结条件(满足边界条件时,停止调用自身)
2.递归条件(满足递归条件时,继续调用自身)
3.基本值(例如:下面demo中基本值就是最后一次调用自身时current的值)
- public static void main(String[] args) {
- //递归
- recursion(1,10);
- }
-
- private static String recursion(int current, int total) {
- if (current > total) {//终结条件
-
- System.out.println("已经停止调用了!");
-
- //返回值
- return "已经停止调用了!";
-
- } else {//递归条件(current <= total)
-
- System.out.println("第" + current + "次调用!");
-
- //(坑)切记:此处一定要在方法前写上return!!!
- return recursion(++current, total);//current不断加1,调用自身
-
- //基本值就是最后一次调用自身时current的值
- }
- }
运行结果
递归其实就是使用if(){}else{}用return结束循环。使用递归能够用简短的代码完成需要多次重复的计算,大大减少了代码量,简而言之:用有限的语句定义对象的无限集合。但递归算法解题的运行效率较低。所以不提倡用递归设计程序。如果使用了递归一定要满足上述三个条件否则一不小心就进了死循环了~
下面来说代码中提到的“坑”------ return
避坑参考URL:https://blog.csdn.net/qq_35624642/article/details/54613886
场景描述:下图代码,我在递归方法里满足递归条件(current <= total)时,继续调用自身(recursion(++current,total)),在最后return,代码执行没有报错,但是发现System.out.println("我返回了")输出了11次!!!!!!后来发现,return的作用于是recursion这个方法,举例:当current=1的时候进recursion方法,此时走的是else里的代码,是继续调用了自己,并没有return。当current=2的时候进recursion方法,此时走的还是else里的代码,还是继续调用了自己,依然没有return......这样依次执行,当current=11的时候,走的是if(current > total)的代码,执行了“System.out.println("已经停止调用了!");” ,然后执行1次“return “返回值current=11”,但是此时对于current=10,current=9,current=8......时调用的recursion方法还都没有执行return,所以按照current=11.10.9.8......3.2的顺序又依次执行了10次“return '返回值current=11,10,9,8,7,6,5,4,3,2”,最后返回值current=2,明显返回值不是我们想要的,我们想要的返回值应该是“返回值current=11”。下图为错误代码示例:
错误代码示例:
为避免这个return的坑,我们使用递归的时候要按照“正确代码实例”的方式去编写代码。
正确代码示例: