Python递归优化避免重复递归:递归程序设计艺术(6)

如果不加以优化的话,递归很容易出现重复计算的问题。比如前面计算斐波那契数列,根据公式有F(n) = F(n-1) + F(n-2)。这意味着为了计算F(8),必须计算F(7)和F(6)。而为了计算F(7),必须计算F(6)和F(5),......。这里F(6)就被计算了两次。一般地,递归程序越靠近边界,重复计算的次数就会呈指数增加。当求F(36)时,电脑已经完全僵死,没有反应了。

那怎么解决这个问题呢?规范的方法是这样的:

  1. 要保证递归程序除了参数之外没有读写任何外部数据。这是为了保证程序的优化只在程序内部发生作用,不会影响到外部环境。这个特点称为函数不变性(Immutable),与数据不变性相对应。函数不变性的另一种理解是,只要参数相同,函数总是返回相同的结果。比如随机数发生函数numpy.random.randint()以及日期函数time.time()就不具有不变性。一般地,如果函数是可变的,可以把相关的外部数据引入参数列表中就能解决这个问题。另外,如果函数只是读取外部数据,没有改写它,那函数也是不可变的。
  2. 在函数的参数中增加一个字典型(dict)的参数d,作用是保存递归调用的中间结果。字典是一种能够根据键获取值的数据类型,Python中的字典相当于Java中的Map。当发生重复调用时,从d中直接获取结果即可,不必进行重复的递归调用。
  3. 把函数当前所有参数集中起来构成一个元组t,在递归假设和递归推导之前看看t是否在d中存在,如果存在,说明本次调用是一个重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方林博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值