2015-07-04 5 views
0

Следующий код возвращает None для некоторых значений (например, 306, 136), для некоторых значений (42, 84) он возвращает ответ правильно. print a и return a должен дать тот же результат, но это не делает:Почему рекурсивная функция Python возвращает None

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) 
+0

Каков ожидаемый выход? –

ответ

5

Вы игнорируете возвращаемое значение для рекурсивного вызова:

gcdIter (a,b%a) 

рекурсивные вызовы не отличаются от вызовов других функций ; вам все равно нужно что-то сделать с результатом этого вызова, если это то, что вы пытались произвести. Вам необходимо пройти по этому возвращаемого значения с return

return gcdIter (a,b%a)  

Обратите внимание, что вы можете назначить нескольким целям при назначении:

def gcdIter(a, b): 
    a, b = min(a, b), max(a, b) 
    if b % a == 0: 
     return a 
    return gcdIter(a, b % a) 

Вы действительно не нужно заботиться о больших и меньших значений здесь , Более компактным вариантом будет:

def gcd_iter(a, b): 
    return gcd_iter(b, a % b) if b else abs(a)