使用python查找使用n步到达一个的collat​​z猜想

时间:2016-05-16 20:13:07

标签: python optimization

所以我正在尝试编写一些python代码,让我根据用于获取1的n个步骤找到collat​​z猜想。
我有一些适用于少量步骤,但大量的步骤需要很长时间来计算。所以我想知道你们中是否有人知道如何加速这个过程:

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步,这已经开始耗费大量时间了。所以我希望有人能给我提示或提示如何提高这个功能的速度。

谢谢。

1 个答案:

答案 0 :(得分:5)

这是给你的一个想法。假设您从10开始计算collat​​z序列:

>>> collatz(10)
[10, 5, 16, 8, 4, 2, 1]

你看到有1步回到1。

稍后假设你从12开始计算了collat​​z序列。经过四个计算步骤:

>>> collatz(12)
[12, 6, 3, 10, ...

等一下!从12到10需要3个步骤。我们已经知道从10开始,需要6个步骤。因此,我们已经告诉我们,从12开始有6 + 3步,而无需再费心去计算序列。

此外,如果我们在扩展一个连枷序列时再次看到12,可以记住我们现在距离团结9步。

如何使用此信息使您的算法更智能?