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
有人可以帮我理解这段代码的作用吗?
答案 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
),则会添加b
到c
。所以你最终会得到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)