试图打破"打破" Collat​​z猜想并生成3n-1序列(将有循环)

时间:2015-04-12 02:03:12

标签: python math

这是我到目前为止所做的:

def collatz_sequence(x):
        seq = [x]
        if x < 1:
           return []
        y = x*2
        while x != 1 and x != y:
           if x % 2 == 0:
                x = x / 2
           else:
                x = 3 * x - 1
           seq.append(x)    # Added line
        return seq

x = 5
while x < 10:
        print collatz_sequence(x)
        x += 1

所以它停止在三个案例中的两个:它实际上工作并转到1,它不起作用并返回到自身(5 - > 14 - > 7 - > 20 - > 10 - > ; 5)。如果它基本上进入另一个循环,它不会停止,例如(9-> 26-> 13-> 35-> 104-> 52-> 26)。

如果重复序列中已有的整数,如何在每个循环结束时检查序列并停止? (我想我可以摆脱执行此操作的while语句的x!= y部分。)

1 个答案:

答案 0 :(得分:0)

您可以使用if x in seq:操作。

def collatz_sequence(x):
        seq = [x]
        if x < 1:
           return []
        y = x*2
        while x != 1 and x != y:
           if x % 2 == 0:
                x = x / 2
           else:
                x = 3 * x - 1
           if x in seq:
                seq.append(x) # Add at end of list so you can see the loop in output
                break
           seq.append(x)    # Added line
        return seq

x = 5
while x < 20:
        print collatz_sequence(x)
        x += 1

当您测试x是否在序列中时,需要稍加注意,以确保在添加项目之前进行测试。 我不确定y变量的功能是什么。