为什么Python递归函数返回None

RTY*_*123 0 python

以下代码返回None某些值(例如306, 136),对某些值(42, 84),它会正确返回答案.在print areturn a应产生相同的结果,但它并不:

def gcdIter (a,b):
    c = min (a,b)
    d = max (a,b)
    a = c
    b = d

    if (b%a) == 0:
        print a
        return a
    gcdIter (a,b%a)    


print gcdIter (a,b)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您忽略了递归调用的返回值:

gcdIter (a,b%a) 
Run Code Online (Sandbox Code Playgroud)

递归调用与对其他函数的调用没有什么不同; 如果那是你试图产生的,你仍然需要对该调用的结果做一些事情.您需要传递该返回值return

return gcdIter (a,b%a)    
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在分配时分配给多个目标:

def gcdIter(a, b):
    a, b = min(a, b), max(a, b)
    if b % a == 0:
        return a
    return gcdIter(a, b % a)  
Run Code Online (Sandbox Code Playgroud)

你真的不需要关心这里越来越大的价值观.更紧凑的版本是:

def gcd_iter(a, b):
    return gcd_iter(b, a % b) if b else abs(a)
Run Code Online (Sandbox Code Playgroud)