神秘的递归函数python

时间:2013-11-19 22:00:14

标签: python recursion

def mystery_code(n):
    return mystery_recursive(n, n-1)

def mystery_recursive(a, b):
    if b<=0:
        return 0
    else:
        c=mystery_recursive(a,b-1)
        if a%b==0:
            c+=b
        return c

有人可以帮我理解这段代码的作用吗?

3 个答案:

答案 0 :(得分:6)

它计算n的适当除数之和。

如果您单步执行代码,则会看到它调用,例如mystery_recursive(5, 4),然后递归mystery_recursive(5, 3)mystery_recursive(5, 2)mystery_recursive(5, 1)mystery_recursive(5, 0)。然后它会返回0,因为b <= 0

在每次调用中,它会将调用结果分配给c,如果a % b == 0(即a可以除以b),则会添加bc。所以你最终会得到n的正确除数的总和。

答案 1 :(得分:0)

正如Simeon Visser已经告知的那样,上面的代码计算了n的适当除数之和。

如果您的函数调用是:

  

mystery_code(12)

然后它会在你的代码中调用神秘递归函数(mystery_recursive(a,b)):

  

mystery_recursive(12,11)

一旦递归函数开始执行,它将继续调用自身直到条件b <= 0满足。在这种情况下,mystery_recursive(12,0)将向变量'c'返回值'0'到其被调用函数mystery_recursive(12,1)。然后,从上面的神秘函数(mystery_recursive(12,1))开始,将计算'c'值并将其返回到它们各自的调用函数,直到被调用的函数mystery_recursive(12,11)。

在这种情况下的输出:16

答案 2 :(得分:0)

将此递归函数转换为交互式版本可能会有所帮助

def mystery_recursive(a, b):
    c = 0
    while True:
        if b <= 0:
            return c
        if a % b == 0:
            c += b
        b -= 1

它仍然有点笨拙,所以尝试将其转换为和生成器表达式

def mystery_recursive(a, b):
    return sum(b for b in range(b, 0, -1) if a % b == 0)

您甚至可以将其转回mystery_code

def mystery_code(n):
    return sum(b for b in range(n - 1, 0, -1) if n % b == 0)