1. 程式人生 > >遞迴的基本使用以及經典案例

遞迴的基本使用以及經典案例

遞迴:方法自己呼叫自己
        遞迴的分類:遞迴分為兩種,直接遞迴和間接遞迴
                        直接遞迴稱為方法自身呼叫自己
                        間接遞迴可以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);
        }
    }
}