我正在尝试为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)
该变量在函数调用之间不存在。如果要在函数之间传递多个值,则将其作为参数传递给函数并返回两者。
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)
有一些选择...
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)