1. 程式人生 > 其它 >關於上樓梯問題(斐波那契數列應用)

關於上樓梯問題(斐波那契數列應用)

技術標籤:java遞迴演算法大斐波數

問題1:樓梯上有n階臺階,上樓時可以一步上1階,也可以一步上兩階,編寫演算法計算共有多少種不同的上樓梯的方法。

為什麼說上樓梯問題是斐波那契數列的應用呢?我們可以先列舉n比較小的時候。
n=1:只有 {1} 一種(1)
n=2:可以有 {1 1} 和2 兩種(2)
n=3:可以有 {1 2} 和 {2 1} 和{1 1 1} 三種(3)
n=4:可以有{2 2} 和{1 1 2} 和{1 2 1} 和{2 1 1}和 {1 1 1 1} 五種(5)

而斐波那契數列(Fibonacci sequence),又稱黃金分割數列指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……

所有經過推導可以看出來該問題可用斐波那契數列求解。
以下為斐波那契數列的公式,若要直接用該函式求解樓梯問題在呼叫時候需要n+1

public static int Fibonacci(int n)
	{
		if(n==0)
		{
			return 0;
		}
		if(n==1)
		{
			return 1;
		}
		return Fibonacci(n-1)+Fibonacci(n-2);
	}

我們還可以這樣理解這個問題,當樓梯數為n時,我們當前需要計算的上樓梯方法可以用當樓梯數為n-1時的上樓梯方法數+樓梯數為n-2時的上樓梯方法數。

public static int Stairs
(int n) { if(n==1) { //樓梯數為1時上樓梯方法為1 return 1; } if(n==2) { //樓梯數為2時上樓梯方法為2 return 2; } return Stairs(n-1)+Stairs(n-2); }

問題2 樓梯上有15階臺階,上樓時可以一步上1階,也可以一步上兩階,我們規定有7步上了一階樓梯。編寫演算法計算共有多少種不同的上樓梯的方法。

這個聽起來有點複雜其實我們可以想一下如果15步裡7步是1階那麼還有4步是兩階,我們可以將不管這次上一階還是兩階都稱為一個step,那我們就一共有4+7=11個step那麼在11個step中選擇4個走兩階即可,所以其方法為

在這裡插入圖片描述


	public static int Anum(int d,int p)
	{
		int res=1;
		for(int i=0;i<p;i++)
		{
			res*=d;
			d-=1;
		}
		return res;
	}
	public static int Cnum(int d,int p)
	{
		return Anum(d,p)/Anum(p,p);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Cnum(11,4));
	}

問題三:問題2 樓梯上有15階臺階,上樓時可以一步上1階,也可以一步上兩階,我們規定走的步數step只能為偶數。編寫演算法計算共有多少種不同的上樓梯的方法。

我們在遞迴時候將其當前所走的步數也加入引數中,每次移動都對其步數資訊進行修改,如果步數為偶數,那麼將其方法數加一。

public static int sum=0;
//n為剩餘的樓梯數
//step為當前走的步數
public static void evenStepAboutStairs(int n,int step)
	{
		if(n<0)
		{
			return ;
		}
		//所有樓梯已走完且步數為偶數時,sum++
		if(n==0&&step%2==0)
		{
			sum++;
		}
		//走一步,步數加一
		evenStepAboutStairs(n-1, step+1);
		//走兩步,步數加一
		evenStepAboutStairs(n-2, step+1);
	}