爬樓梯演算法推導過程及效能優化

2021-10-05 22:35:22 字數 1765 閱讀 1741

n層樓梯,一次只能爬1個、2個台階,多少種爬樓梯的方法?

首先手動算一下n=1,2,3,4,5的情況

1

=>11

2=>21

+123

=>31

+1+1

2+11

+24=>51

+1+1

+12+

1+11

+2+1

1+1+

22+2

5=>81

+1+1

+1+1

2+1+

1+11

+2+1

+11+

1+2+

12+2

+11+

1+1+

22+1

+21+

2+2

可以總結出來,從3開始,爬法次數都是前兩個數字的和

但是我們只算到5,無法保證是否一定是這個規律,而且這個規律有什麼原因嗎?

認真思考,一次只可以爬1階或者2階,那麼一共5階的情況,最後一步要麼是1階要麼是2階

如果最後一步是1階,前邊要爬4階,這種情況就等於4階的爬法

如果最後一步是2階,前邊要爬3階,這種情況就等於3階的爬法

一共就這2種情況,所以5階的爬法就是4階的爬法+3階的爬法

同理,6階7階…都是這樣子的情況,4階、3階也是,2階和1階可以特殊處理

所以我們可以用遞迴的方法來計算,示例**如下

function

way(n)

else

if(n ===1)

else

if(n ===2)

else

return ret;

}

用這個方法可以計算出n階的爬法,但是在我的老破筆記本上,n>30時,就開始計算緩慢,n>40就出現幾秒鐘的等待才能計算出結果。

分析這個問題,遞迴函式呼叫本身會比for迴圈消耗效能,但是這裡主要還是因為計算量太大,那麼是否可以優化?

我們看下6階的遞迴情況

6階

5階 4階

3階2階

1階2階

3階2階

1階4階 3階

2階1階

2階

可以看出來,4階重複計算2次,3階重複計算3次。這是一共6階的情況,那麼數字比較大的時候,就會有更多的重複計算。這個時候就可以考慮空間換時間(計算),把已經計算過的值快取下來,示例**如下

const cache =

;function

waycache

(n)if

(n ===1)

if(n ===2)

if(cache[n]

)return cache[n]

=waycache

(n -1)

+waycache

(n -2)

;}

這樣子計算,速度就會非常快

其實這個問題還可以用for來解決,示例**如下

function

wayfor

(n)if

(n ===

1|| n ===2)

let one =1;

let two =2;

let result =0;

for(

let i =

2; i < n; i++

)return result;

}

python爬樓梯演算法 爬樓梯(Python3)

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...

爬樓梯演算法

有n階樓梯,有1,2,3 走m步走完樓梯,一共有多少種走法,並輸出所有的走法 設走n階台階的走法數為 f n 可以得到 f 1 1 f 2 2 f 3 4 對於n 3時,縮小問題規模 最後一步上乙個台階的話,之前上了n 1個台階,走法為f n 1 最後一步上兩個台階的話,之前上了n 2個台階,走法為...

演算法之爬樓梯

題目 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?沙雕解法一 利用遞迴,就是最後一步一定是前一步走一步或倒退兩步走兩步,超時!include pch.h include include using namespace std i...