我正在尝试制作一个小脚本,一种有效的方法就是调用一个函数。但是,这会给出消息“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)
感谢。
答案 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)
答案 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