遞歸:斐波那契數列,漢諾塔

1. 遞歸介紹

定義:函數或者方法,直接或者間接調用函數本身,則稱該函數或者方法爲遞歸函數或者遞歸方法。

2.舉例

2.1 斐波那契數列

斐波那契數列:1,1,2,3,5,8,13,21…類似於這樣後面一個數是前面兩個數的和,這是一個典型的遞歸問題。

public class Feibonacci {
    public static void main(String[] args) {

        System.out.println(feibonacci(4));
    }
    //返回第n項斐波那契數列
    public static int feibonacci(int n){
        if(n==1||n==2){
            return 1;
        }else{
            return feibonacci(n-2)+feibonacci(n-1);
        }
    }
}

2.2 漢諾塔問題

如下圖所示,將A柱子的圓盤移動到C柱子,但是有一個規則:只能是小的圓盤放在大的圓盤上面,不能大的圓盤放在小的圓盤上面。
Alt
分析:經過思考後發現,這是一個比較典型的遞歸問題,可以將該問題總結爲兩種情況:第一種:只有一個盤子時,直接將盤子從A柱子移動到C柱子。第二種:當有兩個或者兩個以上的盤子時,第一步:將A柱子的盤子分爲兩種類型,即爲上面的所有盤子和最下面的一個盤子,藉助C柱子的作用,先將A柱子上面的所有盤子移動到B柱子,然後將最下面的盤子移動到C柱子;第二步:將B柱子上面的盤子用類似於A柱子的方法,移動到C柱子。

public class Hanoita {
    public static void main(String[] args) {
        hanoi(3,'A','B','C');
    }
    public static void hanoi(int i,char from,char in,char to){
        if(i==1){
            System.out.println("第1個盤子從"+from+"移動到"+to);
        }else{
            //將盤子分爲上面所有的盤子和最下面的一個盤子
            //1.將上面所有的盤子移動到中間的柱子
            hanoi(i-1,from,to,in);
            //2.將最下面的盤子,移動到最右邊的柱子
            System.out.println("第"+i+"盤子從"+from+"移動到"+to);
            //3.將上面的所有盤子從中間的柱子移動到最右邊的柱子
            hanoi(i-1,in,from,to);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章