【发布时间】:2021-05-29 18:16:17
【问题描述】:
我想计算一些非常大的数字的 collatz 序列,但我猜 python 无法处理这么大的数字,我不知道如何让它处理。
这是我的程序:
def collatz(n):
if (n == -1 or n == 1 or n == -17 or n == -17 -2**4096):
print('break found',n)
return
if str(n)[-1] in ['1','3','5','7','9']:
#print(n)
return collatz(3*n + 1)
else:
return collatz(n//2)
我想使用n = 2**4096 范围数字。我通过sys.setrecursionlimit 函数增加了递归限制。但现在我面临分段错误错误。
>>> sys.setrecursionlimit(10**9)
>>> collatz(2**1000 + 1)
break found: 1
>>> collatz(2**4000 + 1)
Segmentation fault (core dumped)
请就我需要修改的内容给我一些建议以实现大输入支持..
【问题讨论】:
-
不要使用递归(你没有足够大的堆栈)。此外,您有一个不返回值的分支...
-
另外,使用
n % 2 == 1代替str(n)[-1] in ['1','3','5','7','9']- 将大整数转换为字符串可能会很慢(尽管2**4096不是特别大。
标签: python segmentation-fault collatz