为什么我的数字仅为Collat​​z序列的2?

时间:2014-01-26 00:06:12

标签: algorithm math python-2.7 sequence collatz

我正在尝试制作一个程序,使用Collat​​z序列计算数字何时达到零。这是我的程序代码:

import time

def run(z):
    while z != 1:
        if isEven(z) == True:
            z = z/2
            print z
        else:
            z = (3*z)+1
            print z
    else:
        print 'Got one!'
        z = z+1
        print 'Trying for %d...' %(z)
        time.sleep(0.1)
        run(z)



def isEven(number):
        return number % 2 == 0

run(z)

但是,z永远不会超过2,它只会保持打印:

Got one!
Trying for 2...
1
Got one!
Trying for 2...
1

等等......谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

当z为1时,退出while循环,输入调用else的{​​{1}},将z设置为1,调用run(2)等等等等。

答案 1 :(得分:1)

Collatz conjecture是你会达到一个,而不是零;当你到达一个,你应该停止。此外,您有while循环和递归调用的奇怪组合。一个非常简单的递归实现:

def collatz(n):
    print(n)
    if n == 1: # base case
        print("Done!")
    else:
        if n % 2: # odd number
            collatz((3 * n) + 1)
        else: # even number
            collatz(n / 2)

或迭代版本:

def collatz(n):
    while n != 1:
        print(n)
        if n % 2: # odd number
            n = (3 * n) + 1
        else: # even number
            n /= 2
    print(n)
    print("Done!")

如果您想分析一个数字到达一个数字所需的时间,您可以重新设置其中一个实现,例如:

def collatz(n):
    count = 0
    while n != 1:
        count += 1
        if n % 2: # odd number
            n = (3 * n) + 1
        else: # even number
            n /= 2
    return count

然后,您可以调用此函数,完成整数,为每个函数创建Collat​​z序列,例如:

seq_len = [(n, collatz(n)) for n in range(1, 101)]