10.斐波那契數(shù)列 與 跳臺階問題

1.斐波那契數(shù)列問題

題目:求斐波那契數(shù)列的第n項

寫一個函數(shù),輸入n,求斐波那契(Fibonacci)數(shù)列的第n項
斐波那契數(shù)列的定義如下:
    ┌ 0       ,  n = 0
f(n)=  ├ 1       ,  n = 1
    └ f(n-1) + f(n-2)  ,  n > 1

0,1,1,2,3,5,8,13…

思路

函數(shù)本身是遞歸定義,直接用遞歸方式編寫代碼,在遞歸樹中可以得知,這個過程中出現(xiàn)很多重復節(jié)點,時間復雜度是指數(shù)級。因此不實用。
比較好的思路是從底向上計算f(n),保留兩個下層函數(shù)f(n-1) , f(n-2)的值用于下輪計算。
實現(xiàn)如下:

public static int Fibonacci(int n) {
    if(n <= 0) 
        return 0;
    if(n == 1) 
        return 1;

    int fibNumOne= 0;
    int fibNumTwo= 1;
    int fib = 0;
    for(int i = 2; i <= n; ++i) {
        fib =  fibNumOne + fibNumTwo;
        fibNumOne= fibNumTwo;
        fibNumTwo= fib;
    }
    return fib;
}

2.跳臺階問題

題目

一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

思路

很明顯的求斐波那契數(shù)列類型的題目
當跳n級臺階的時候,設跳法有f(n)種
青蛙的第一步,可以跳1級,也可以跳2級(只有這兩種選擇)

  1. 當跳1級的時候,剩下的有f(n-1)種
  2. 當跳2級的時候,剩下的有f(n-2)種
    因此, f(0) = 0, f(1) = 1, f(2) = 2, f(n) = f(n-1) + f(n-2)

3.變態(tài)跳臺階問題

題目

一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

思路

跳上1級臺階有1種跳法(1)
跳上2級臺階有2種跳法(1-1、2)
跳上3級臺階有4種跳法(1-1-1、1-2、2-1、3)
討論一般情況:假設跳上n級臺階有f(n)種跳法
f(n)種方法包括:
跳上1級臺階后直接跳上n級臺階 ,此時有f(1)種跳法
跳上2級臺階后直接跳上n級臺階 ,此時有f(2)種跳法
跳上3級臺階后直接跳上n級臺階 ,此時有f(3)種跳法
……
跳上n-1級臺階后直接跳上n級臺階 ,此時有f(n-1)種跳法
直接跳上n級臺階 ,此時有1種跳法
得到:
當n=1時,f(n) = 1
當n>1時, f(n) = f(1) + f(2) + … + f(n-1) + 1
因此:
f(n) = 2 ^ (n-1)

實現(xiàn)

public static int JumpFloorII(int target) {
    if(target <= 0) 
        return 0;
    int result = 1;
    for(int i = 0; i < target-1; ++i) {
        result *= 2;
    }
    return result;
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容