題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
分析
1層 只有一種跳法
2層 :1,1;2兩種
3層:1,1,1;1,2;2,1;3;四種
4層:3層的沒一種跳法 再跳一層與之組合 及發f(3)+f(3)*1
5層:4層的所有跳法在條一層與之組合f(4)+f(4)*1
易知 f(n)=f(n-1)+f(n-2)+……f(1)
f(n-1)=f(n-2)+……f(1)
兩式相減得f(n)=2f(n-1)
代碼
function jumpFloorII(number)
{
let fibonacci = function(n){
if(n < 2 ){
return 1;
}else{
return 2*fibonacci(n-1);
}
}
//簡單緩存函數
const memorize = function(fn) {
const cache = {} // 存儲緩存數據的對象
return function(...args) { // 這裏用到數組的擴展運算符
const _args = JSON.stringify(args) // 將參數作爲cache的key
return cache[_args] || (cache[_args] = fn.apply(fn, args)) // 如果已經緩存過,直接取值。否則重新計算並且緩存
}
}
fibonacci = memorize(fibonacci)
return fibonacci(number);
}
測試
總結
青蛙跳是貪心算法的入門經典問題,關鍵是通過前四項能夠推導出遞推公式,得到公式就是簡單的遞歸算法設計了
需要注意的是此類遞歸必須用緩存函數進行優化否則性能上會有很大問題