递归算法中的小Tips

递归算法中的小Tips


递归的基本操作已经在 二叉树的笔记中介绍了。但是在做题的过程中发现,递归还是有一些小技巧的。有时候一般的递归还有可能超出时间限制

记忆化

在递归的过程中,尤其是诸如斐波那契数列的计算过程中,由于递归的树形结构,经常会导致多余的计算量。因此,可以通过先建立一个HashMap将计算过的结果存入,便于后续调用。
诸如爬楼梯这道题,引入res后可以减少很多计算时间

    def climbStairs(self, n: int) -> int:
        res = {}
        def recur_fib(n):
            if n in res.keys():
                return res[n]
            if n <= 2:
                res[n] = n
            else:
                res[n] = recur_fib(n-1) + recur_fib(n-2)
            return res[n]
        return recur_fib(n)
尾递归

尾递归其实不算是一种小trick,只是一种只在最后返回的时候进行一次的递归方式。
不过,递归过程中可能会存在一些计算变量的迭代。
例如,二叉树的最大深度

ps:判断一棵树是否是BST在每次迭代的时候都要加入low和high,而且不断迭代变换。

快速幂

在进行累乘的时候,显然你可以一次次的累乘
2 n = 2 ∗ 2 ∗ 2... ∗ 2 2^n = 2*2*2...*2 2n=222...2
显然,这样存在很多的冗余计算,简化一下我们可以写成这样
2 n = 2 n / 2 ∗ 2 n / 2 2^n = 2^{n/2}*2^{n/2} 2n=2n/22n/2
这样的话,我们可以每次计算的时候直接计算一半即可。
这样,我们可以写出累乘的代码

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if n > 0:
            return self.help(x,n)
        else:
            return 1/self.help(x,-n)
    
    def help(self,a,b):
        if b == 0: return 1
        half = self.help(a,b//2)
        if b % 2 == 0:
            return half*half
        else:
            return half*half*a
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值