递归的基本使用以及经典案例

递归:方法自己调用自己
        递归的分类:递归分为两种,直接递归和间接递归
                        直接递归称为方法自身调用自己
                        间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
  
注意事项:
                递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
                在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
                构造方法,禁止递归//编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,
                直接编译报错

当调用方法的时候,方法的主体不变,每次调用 方法的参数不同,可以使用递归

经典案例一:求1-n的和

public class QiuHeDiGui {
    public static void main(String[] args) {
        System.out.println(sum(3));
    }

    private static int sum(int n) {
        if(n==1){
            return 1;
        }
        return n+sum(n-1);
    }
}

注意:
使用递归求和,main方法调用sum方法,sum方法会一直调用sum方法
导致在内存中有多个sum方法(频繁的创建方法,调用方法)效率低下

    所以如果仅仅是计算1-n之间的和,不推荐使用递归,使用for循环即可

经典案例二:用递归实现不死神兔
故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,
再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,没有发生死亡,
问:现有一对刚出生的兔子2年后(24个月)会有多少对兔子?

案例分析,找到规律你会发现,从第三天起,面一天兔子的数目是前一天兔子数目加上前两天兔子之和,因为前一天的兔子里面只有前两天的兔子才能生小兔子。
所以n(当天的兔子数目)=(n-1)(当天的兔子数目)+(n-2)(当天的兔子数目)

public class TestTZ02 {
    public static void main(String[] args) {
        System.out.println(method(24));
    }
    public static int method(int n) {
        if(n==1){
            return 1;
        }else if(n==2){
            return 1;
        }else {
            return method(n-1)+method(n-2);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43908950/article/details/84981937