我正在尝试制作一个程序,使用Collatz序列计算数字何时达到零。这是我的程序代码:
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
等等......谁能告诉我我做错了什么?
答案 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
然后,您可以调用此函数,完成整数,为每个函数创建Collatz序列,例如:
seq_len = [(n, collatz(n)) for n in range(1, 101)]