我正在尝试为collatz猜想创建一个python脚本(如果一个数字是奇数,则乘以3并加1,如果它是偶数,则除以2(。我不知道如何成功递增一个变量来显示函数的迭代次数,我认为这与它的递归有关。这是我到目前为止得到的:
def collatz(n):
list_terminate = [0, 1, 2, 4]
if n in list_terminate:
return n
else:
if n % 2 == 0:
print(n)
iterations += 1
return collatz(n // 2)
if n % 2 == 1:
iterations += 1
print(n)
return collatz((n * 3) + 1)
有几个选项...
1( 更改函数签名以包含迭代次数。这样,您可以将信息传递到"链上">
2( 更改 num 迭代的范围,使变量存在于函数之外。
3( 在 collatz 中添加一个递归函数。
方法 (1, 3(
def collatz(n):
def recursion(x, iterations):
print(f"{iterations}: {x}")
if x in [0,1,2,4]:
return x, iterations
if x % 2 == 0:
return recursion(x//2, iterations + 1)
else:
return recursion((x*3) + 1, iterations + 1)
return n
n, steps = recursion(n, 0)
方法(2(
iterations = 0
def collatz(n):
global iterations
print(f"{iterations}: {n}")
if n in [0,1,2,4]:
return n, iterations
iterations += 1
if n % 2 == 0:
return collatz(n//2)
else:
return collatz((n*3) + 1)
变量在函数调用之间不会持久存在。如果要在函数之间传递多个值,请将其作为参数传递给函数并返回这两个值。
def collatz(n, iterations):
list_terminate = [0, 1, 2, 4]
if n in list_terminate:
return (n, iterations)
else:
if n % 2 == 0:
print(n)
iterations += 1
return collatz(n // 2, iterations)
if n % 2 == 1:
iterations += 1
print(n)
return collatz((n * 3) + 1, iterations)
如果你不喜欢像collatz(n, 0)
这样调用你的函数,那么使用这是一个包装函数。
def collatz_helper(n, iterations):
list_terminate = [0, 1, 2, 4]
if n in list_terminate:
return (n, iterations)
else:
if n % 2 == 0:
print(n)
iterations += 1
return collatz(n // 2, iterations)
if n % 2 == 1:
iterations += 1
print(n)
return collatz((n * 3) + 1, iterations)
def collatz(n):
return collatz_helper(n, 0)
您的问题陈述有点令人困惑,但如果适合您,您可以尝试以下代码。
def collatz(n):
iterations = 0
list_terminate = [0, 1, 2, 4]
if n in list_terminate:
return n
elif n % 2 == 0:
# print(n)
iterations += 1
return ("No. of iterations : ", iterations, n//2)
elif n % 2 == 1:
iterations += 1
# print(n)
return ("No. of iterations : ", iterations,(n * 3) + 1)