前言:遞歸(recursion):遞歸滿足2個條件
1)有反復執行的過程(調用自身)
2)有跳出反復執行過程的條件(遞歸出口)
第一題:漢諾塔
對於這個漢諾塔問題,在寫遞歸時,我們只需要確定兩個條件:
1.遞歸何時結束?
2.遞歸的核心公式是什么?即:
怎樣將n個盤子全部移動到C柱上?
即:若使n個盤子全部移動到C柱上,上一步應該做什么?
代碼實現
package diguui;
public class digui1 {
public static void hanoi(int n,int p1,int p2,int p3)
{
if(1==n)
System.out.println("盤子從"+p1+"移到"+p3);
else
{
hanoi(n-1,p1,p3,p2);
System.out.println("盤子從"+p1+"移到"+p3);
hanoi(n-1,p2,p1,p3);
}
}
public static void main(String[] args) {
/*4表示盤數,1表示開始柱子,2表示開始柱子,3表示開始柱子*/
hanoi( 4, 1, 2, 3);
}
}
效果圖
第二題:一般而言,兔子在出生兩個月后,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那么一年以后可以繁殖多少對兔子?
分析如下:
第一個月小兔子沒有繁殖能力,所以還是一對;
兩個月后,生下一對小兔子,總數共有兩對;
三個月以后,老兔子又生下一對,因為小兔子還沒有繁殖能力,總數共是三對;
……
依次類推可以列出下表:
可以得出:
斐波納契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……
這個數列從第三項開始,每一項都等於前兩項之和。
package diguui;
public class digui1 {
public static int fun(int m){
if(m<2){
return 1;
}else{
return fun(m - 1)+fun(m-2);
}
}
public static void main(String[] args) {
System.out.println(fun(12));
}
}