我写了这个非常简单的函数来计算Collatz系列收敛到1的步骤。它被递归调用,但是使用了一个我想消除的全局变量。我相信,正确的方法是使变量成为函数调用的参数。但是,当我这样做时,我得到了调用全部取消后的值,而不是最后一个值。例如,如果您使用$language = array_map(function($object)
{
return $object->name;
}, $jsonReponse);
调用此函数,则会返回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 :(得分:3)
不需要全局,每个函数返回从该序列开始加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
答案 1 :(得分:1)
局部变量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