防止超过最大递归深度

时间:2015-05-31 21:33:21

标签: python recursion

我正在尝试制作一个小脚本,一种有效的方法就是调用一个函数。但是,这会给出消息“RuntimeError:获取对象的str时超出了最大递归深度”。

我试图让程序在它到达之前退出,但它似乎没有完成这项工作。我想知道在一定次数的运行后是否有任何方法可以停止程序,因此不会发生此错误。以下是我尝试解决此问题的方法:

import sys
n = 0
def cycle(b,n):
    total = 0
    for i in str(n):
        for y in i:
         total+=int(y)**b
    n+=1
    print(total)
    if n == 10:
     sys.exit()
    else:
     cycle(b,total)
cycle(2,562)

感谢。

4 个答案:

答案 0 :(得分:2)

尝试传入计数器并避免给出令人困惑的变量名称:

import sys
def cycle(b,n, counter):
    total = 0
    for i in str(n):
        for y in i:
         total+=int(y)**b
    counter+=1
    print(total)
    if counter == 10:
     sys.exit()
    else:
     cycle(b,total,counter)
cycle(2,562,0)

Run it here.

答案 1 :(得分:0)

递归调用函数可能很方便,但肯定效率不高(至少使用你正在使用的python的实现,因为你得到了这个错误)。

然而,您正在尝试做的事情,即限制递归深度,已经发生了,因为您收到与递归深度相关的运行时错误。

为什么不在更高级别捕获运行时错误?

答案 2 :(得分:0)

快乐的数字(这是你在那里做的)end in 1 or end up in the cycle 4, 16, 37, 58, 89, 145, 42, 20, 4, ...。所以当你达到1或4时就停止。虽然一般来说,如果你的递归太深,你应该考虑迭代解决方案。

答案 3 :(得分:0)

您需要返回并使用正确的基本案例:

def cycle(b, n, seen):
    total = 0
    if n == 1 or n in seen:
        return n == 1
    for i in str(n):
        for y in i:
            total += int(y) ** b
    seen.add(n)
    n += 1
    return cycle(b, total, seen)


print(cycle(2, 19,set()))

输出:

In [34]: cycle(2,562,set())
Out[34]: False

In [35]: cycle(2,19,set())
Out[35]: True

In [36]: cycle(2,1,set())
Out[36]: True

In [37]: cycle(2,2,set())
Out[37]: False

In [38]: cycle(2,7,set())
Out[38]: True