[英]eliminate global variable from recursive function
我写了这个非常简单的函数来计算Collatz系列收敛到1的步骤。它被递归调用,但是使用了一个我想消除的全局变量。 我相信,正确的方法是使变量成为函数调用的参数。 但是,当我这样做时,我得到了调用全部取消后的值,而不是最后一个值。 例如,如果您使用steps = 0; collatz(97)
调用此函数steps = 0; collatz(97)
steps = 0; collatz(97)
,您将获得118
回报。
def collatz(num):
global steps
steps += 1
if num == 1:
return
if num % 2 == 0:
num = num / 2
else:
num = 3 * num + 1
collatz(num)
return (steps - 1)
带有参数的变量步骤:
def collatz(num,steps):
steps += 1
if num == 1:
return
if num % 2 == 0:
num = num / 2
else:
num = 3 * num + 1
collatz(num,steps)
return (steps - 1)
collatz(97,0)
返回0
。 我知道我在俯视什么,但是呢?
不需要全局,每个函数都返回从该序列开始所需的步骤加1,其中基本情况( num == 1
)返回0
:
def collatz(num):
if num == 1:
return 0
if num % 2 == 0:
num = num / 2
else:
num = 3 * num + 1
return collatz(num) + 1
例如
>>> collatz(97)
118
局部变量steps
是不可变的。 递归调用将无法神奇地对其进行修改或重新绑定,而递归函数也将无法访问周围的范围。 您必须通过返回值传递递归中间结果。 请尝试以下操作:
def collatz(num, steps=0):
if num == 1:
return steps
if num % 2 == 0:
num = num / 2
else:
num = 3 * num + 1
return collatz(num, steps+1)
>>> collatz(97)
118
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.