遞歸(斐波那契數列與漢諾塔問題)

1.斐波那契數列

要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。n<=39

觀察斐波那契數列的特徵可以知道當n>2時,第n項的結果都是由前兩項相加而得到的,因此使用遞歸的思想,即f(n)=f(n-1)+f(n-2)。

public static  long method(int n) {
			if(n<2) {
				return 1;
			}else {
				long a=method(n-1) + method(n-2);
				return a;
			}
			
		}

另外還有一種不使用遞歸的方法,如下所示主要是改變賦值。

private static int method2(int n) {
		// TODO Auto-generated method stub
			//a,b,c
			int a=1;
			int b=1;
			int c = 0;
			for(int i=1;i<n;i++) {
				c=a+b;
				a=b;
				b=c;
			}
		return c;
	}

2.漢諾塔問題

漢諾塔問題實際上也是一個遞歸問題,解決該問題的核心在於,無論有多少個盤子,都只認爲有兩個,即上面所有盤子作爲一個整體和最下面的一個。那麼最終就只簡化爲三步操作,如上圖所示從左到右分別爲A\B\C柱子,假設只有兩個盤子,詳解操作如下

第一步:將最上面盤子從A移動到B

第二步:將最底下的盤子從A移動到C

第三步:將B中的盤子移動到C

代碼如下:

public class Hanno {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		hanno(2,'A','B','C');
	}
	/*
	 * n 表示n個盤子
	 * from 爲開始的盤子
	 * in爲中間的盤子
	 * to爲目標盤子
	 * 
	 * _|_  _|_  _|_
	 * A     B    C 
	 */
	public static void hanno(int n,char from,char in,char to) {
		if(n==1) {
			System.out.println("將第1個盤子從"+from+"移動到"+to);
		}else {
			//無論有多少個盤子,都認爲只有兩個,即最上面的整體和最底下的一個
			hanno(n-1,from,to,in);
			System.out.println("將第"+n+"個盤子從"+from+"移動到"+to);
			hanno(n-1,in,from,to);
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章