JAVA遞歸算法及經典遞歸例子 對於這個漢諾塔問題


前言:遞歸(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));
	}
 
}
 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM