繁体   English   中英

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

[英]eliminate global variable from recursive function

我写了这个非常简单的函数来计算Collat​​z系列收敛到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM