【问题标题】:Recursion to Iteration? Max recursion depth exceeded递归到迭代?超出最大递归深度
【发布时间】:2016-05-18 23:57:44
【问题描述】:

我有一个我想无限期运行的程序,它显示一个随机的 5 长字母数字字符串,并生成时间。我有一个条件检查字符串以显示生成中包含子字符串。问题是我得到了错误:

RuntimeError: maximum recursion depth exceeded

我有以下几点:

import random,datetime
def gen():
    global rand
    rand=''.join(random.choice('0123456789abcdefghijklmnopqrstuvwxyz') for i in range(5))
    return rand

def main(num):
    print datetime.datetime.now(),'::',num
    if 'xxx' in num:
        print 'Generated string contains xxx! Continuing...'
        main(gen())
    else:
        print datetime.datetime.now(),'::', num
        'xxx not in string.'
        main(gen())

main(gen())

我该如何转换或纠正这个问题?谢谢

【问题讨论】:

  • 将递归改为迭代。递归是没有意义的,显然 Python 不够聪明,无法将其作为尾递归处理。
  • @TomKarzes - Python 没有 TCO,因为GvR felt that a full stack trace was more important
  • @Tom:这确实是有意义,它只是一种不寻常且不恰当的风格。
  • @TomKarzes:如果您愿意,可以添加 TCO 装饰器,但代码应该以更惯用的方式重写:for num in iter(gen, None): print("{now}...
  • 不相关:删除global rand:它在这里没有任何用处。通常应该避免使用全局变量。

标签: python function recursion


【解决方案1】:

只需使用无限循环,并在循环内调用gen(),而不是将其作为参数传递给main

def main():
    while 1:
        num = gen()
        print datetime.datetime.now(),'::',num
        if 'xxx' in num:
            print 'Generated string contains xxx! Continuing...'
        else:
            print datetime.datetime.now(),'::', num
            'xxx not in string.'

main()

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 2016-12-10
    • 2013-12-01
    • 2018-12-03
    • 2017-03-24
    • 2011-12-31
    • 2017-08-09
    • 2011-03-31
    相关资源
    最近更新 更多