Python递归优化

博客文章迁移: 2018-05-15 11:17


在codewars上做题时遇到的坑(https://www.codewars.com/kata/build-a-pile-of-cubes/solutions/python).

为了少写几行代码直接用递归做的, 测试的时候才想起来递归太多次了, 没法正确执行..

然后就去搜了一下递归优化方面的文章, 发现可以改成尾递归来让python优化执行.

一般递归:

def recsum(x):
 if x == 1:
 return x
 else:
 return x + recsum(x - 1)

尾递归:

def tail_recursion(n, total=0):
    if n == 0:
        return total
    else:
        return tail_recursion(n-1, total+n)

我看了一下我当时提交的代码, return时并没有用到表达式, 已经属于尾递归的形式了, 所以说递归应该是没法用了.

接着我又看到了一个曲线救国的方法, 改用生成器:

把需要优化的函数的return改成yield,外面套个装饰器,就叫tail_call_opm。装饰器最内层的逻辑是

while True:
    try:
        ret=next(ret)
    except:
        return ret

作者:NightyNight链接:https://www.zhihu.com/question/29717057/answer/178798202来源:知乎着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

这样就改成了:

def ret(n, total=0):

(PS:但是这样代码就太长了= =所以我改成迭代交了上去,逃…

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • https://my.oschina.net/leejun2005/blog/503562 深入浅出 Python...
    点点渔火阅读 1,186评论 0赞 1
  • 长久以来,面向对象在 JavaScript 编程范式中占据着主导地位。不过,最近人们对函数式编程的兴趣正在增长。函...
    神刀阅读 603评论 0赞 0
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,245评论 0赞 15
  • es6出来已经很长时间了,平时工作中也会用到很多es6的新特性,自以为很多东西已经了解清楚了。 周末有空从头开始把...
    lemonzoey阅读 1,880评论 0赞 1
  • 1.函数参数的默认值 (1).基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
    赵然228阅读 886评论 0赞 0

友情链接更多精彩内容