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柱子,但是有一個規則:只能是小的圓盤放在大的圓盤上面,不能大的圓盤放在小的圓盤上面。
分析:經過思考後發現,這是一個比較典型的遞歸問題,可以將該問題總結爲兩種情況:第一種:只有一個盤子時,直接將盤子從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);
}
}
}