优点:
1. 简洁
2.在树的前序,中序,后序遍历算法中,递归的实现明显要比循环简单得多。
3 代码更简洁清晰,可读性更好
缺点:
1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能
4.由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。
总的来说:
小的简单的用循环,,
太复杂了就递归吧,,免得循环看不懂
package digui; /** * 最常见的就是阶乘,比如求5的阶乘,数学公式就是:5*4*3*2*1 */ public class Digui { public static int digui(int n) { if (n == 1 || n == 0) { return n; } else { System.out.println("执行第" + n + "次"); return n * digui(n - 1); } } public static void main(String[] args) { System.out.print(digui(5)); } }package digui; /** * 求1+2+3+4+5+6+7……+1000的和 */ public class Digui1 { public static int count(int n){ if(n > 0){ return n + count(n - 1); }else { return 0; } } public static void main(String[] args) { int sum = count(1000); System.out.println(sum); } }package digui; /** * 1,1,2,3,5,8,13,21,34...,求用递归算第30个数 */ public class Digui2 { public static int count(int n ){ if(n == 1 || n == 2){ return 1; } return count(n - 1) + count(n - 2); } public static void main(String[] args) { int sum = count(30); System.out.println(sum); } }