一、遞歸思想
遞歸的思想就是把一個問題分解成一個個的子問題和子子問題,然後這些子問題逐級返回,得到最終結果。
總結一下遞歸需要滿足的幾個條件:
- 一個問題的解可以分解爲幾個子問題的解。
- 問題與子問題,求解思路完全一樣。
- 存在遞歸終止條件。
二、斐波那契數列
1.斐波那契數列: 斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契以兔子繁殖爲例子而引入,故又稱爲“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)
2.代碼實現
private static int febonacii(int index) {
//終止條件
if (index == 0) {
return 0;
}else if(index ==1){
return 1;
}else {
//遞歸
return febonacii(index - 1) + febonacii(index - 2);
}
}
3.結果:
febonacii(8)
34
三、漢諾塔
1.漢諾塔遊戲規則:把所有圓環從最左邊的柱子移動到最右邊的柱子(有三個柱子),每次只能移動一個盤子,大圓環不能壓在小圓環上。
2.分析:第一關
第二關:
第三關:
第四關:
通過上面演示可以分析得出以下結論:
- 只有1個圓環則直接把圓環從from移動到to
- 無論多少(n)個圓環都看成兩個圓環(n-1)爲一個圓環,n爲最後一個圓環
- 把n-1個圓環移動到中間柱子
- 移動最後一個盤子到最右邊的目標柱子
- 把n-1個圓環從中間柱子移動到目標柱子
3.代碼實現:
public static void hanoi(int n, String from, String in, String to) {
//只有一個圓環則直接把圓環從from移動到to
if (n == 1) {
System.out.println("第1個圓環從" + from + "移動到" + to);
}else {
//無論多少(n)個圓環都看成兩個圓環(n-1)爲一個圓環,n爲最後一個圓環
//把n-1個圓環移動到中間柱子
hanoi(n-1,from,to,in);
//移動最後一個盤子到最右邊的目標柱子
System.out.println("第"+n+"個圓環從" + from + "移動到" + to);
//把n-1個圓環從中間柱子移動到目標柱子
hanoi(n-1,in,from,to);
}
}
4.結果:
hanoi(4,"A","B","C");
第1個圓環從A移動到B
第2個圓環從A移動到C
第1個圓環從B移動到C
第3個圓環從A移動到B
第1個圓環從C移動到A
第2個圓環從C移動到B
第1個圓環從A移動到B
第4個圓環從A移動到C
第1個圓環從B移動到C
第2個圓環從B移動到A
第1個圓環從C移動到A
第3個圓環從B移動到C
第1個圓環從A移動到B
第2個圓環從A移動到C
第1個圓環從B移動到C