關於上樓梯問題(斐波那契數列應用)
阿新 • • 發佈:2021-02-08
問題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);
}