记忆化递归

记忆化递归

​ 在递归的过程中难免会存在相同的值,相同的计算过程,那么重复的计算难免会浪费资源。因此将这类值存储起来,在递归的过程中使用,这样的过程称为记忆化递归。

递归例子

​ 一只青蛙每次能跳1级或者2级的台阶,现在计算跳到n级台阶的跳法有多少种?

分析

​ 对于n级台阶而言,青蛙倒数最后第二次,一定跳到的是n-1,或者是n-2的台阶。跳到n-1或者n-2的跳法数相加便是跳到n级的跳法数。那么套娃递归公式就出来了
f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n1)+f(n2)
​ 如果为5级台阶

																				      5
																		  4         			 3
																 3			    2        2               1
															 1            2 

​ 由此得出n-k = 1或者2是为结束条件,跳1阶台阶跳法为1种,2阶台阶跳法为2种

代码

function step(n){
    if(n==2){
        return 2
    }
    if(n==1){
        return 1
    }
    return step(n-1)+step(n-2)
}

//测试
let pre = process.uptime();
console.log('跳法:',step(5))   //8种
let err = process.uptime() - pre;
console.log(err * 1000)

递归优化

​ 在以上例子中,对于5级台阶,每次都需要重复计算相同台阶的跳法,这样使得效率很低。

​ 因此可以使用空间换取效率

let cache = [, 1, 2]
function step(n) {
    if (!cache[n] && cache[n] != 0) {
        cache[n] = step(n - 1) + step(n - 2);
    }
    return cache[n]
}

//测试
let pre = process.uptime();
console.log('跳法:',step(70))
let err = process.uptime() - pre;
console.log(err * 1000)

前后结果对比

​ n = 100

​ 未优化,时间太长

​ 优化后,10m以内

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值