从递归函数中消除全局变量

时间:2018-12-18 15:47:36

标签: python

我写了这个非常简单的函数来计算Collat​​z系列收敛到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)。我知道我在俯视什么,但是什么?

2 个答案:

答案 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