所以我正在尝试编写一些python代码,让我根据用于获取1的n个步骤找到collatz猜想。
我有一些适用于少量步骤,但大量的步骤需要很长时间来计算。所以我想知道你们中是否有人知道如何加速这个过程:
def cj(i):
out = []
out.append(i)
while i != 1:
if i%2==0:
i = i/2
out.append(i)
else:
i = i*3+1
out.append(i)
return out
这会循环所有数字,直到一个匹配我正在寻找的步骤数量:
def cj_steps(n):
x = 1
while True:
if len(cj(x))-1 == n:
return x
else:
x +=1
这就像我说的那样,只需要少量步骤,但需要花费812步,这已经开始耗费大量时间了。所以我希望有人能给我提示或提示如何提高这个功能的速度。
谢谢。
答案 0 :(得分:5)
这是给你的一个想法。假设您从10开始计算collatz序列:
>>> collatz(10)
[10, 5, 16, 8, 4, 2, 1]
你看到有1步回到1。
稍后假设你从12开始计算了collatz序列。经过四个计算步骤:
>>> collatz(12)
[12, 6, 3, 10, ...
等一下!从12到10需要3个步骤。我们已经知道从10开始,需要6个步骤。因此,我们已经告诉我们,从12开始有6 + 3步,而无需再费心去计算序列。
此外,如果我们在扩展一个连枷序列时再次看到12,可以记住我们现在距离团结9步。
如何使用此信息使您的算法更智能?