java 递归总结

优点:

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);
    }

}





你可能感兴趣的:(java,Java递归算法总结)