无法弄清楚如何在递归函数中增加变量



我正在尝试为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)

最新更新