题目描述
一只青蛙一次可以跳上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);
}
测试
总结
青蛙跳是贪心算法的入门经典问题,关键是通过前四项能够推导出递推公式,得到公式就是简单的递归算法设计了
需要注意的是此类递归必须用缓存函数进行优化否则性能上会有很大问题