在寫一個展轉相除求最小公因數的程序的時候,忽然發現本身無論怎麼寫(除了兩數恰巧能夠整除),return 返回的值恆爲 none。算法
代碼爲此:函數
1 def gcd(a,b): 2 if a%b==0: 3 return b 4 else: 5 gcd(b,a%b)
總之調試一下,獲得的結果是各部分輸出正常。spa
而後用循環作了一遍:調試
1 def gcd(a,b): 2 a=int(a) 3 b=int(b) 4 while a%b!=0: 5 save=a 6 a=b 7 b=save%b 8 return b
輸入a=25,b=15,收到的結果是5。結果正確。code
因而能夠確定,算法沒有問題,可是不服氣啊,憑什麼遞歸作不出來,擺着試試的想法,把return換成了print。輸出正常。blog
而後就更加摸不着頭腦了,爲何 print 能夠,你 return 就不行。遞歸
因而開始百度 Return 的用法,調用函數的時候,若是沒有執行 return 命令(或 return 命令未接收數據),默認會返回 none 。class
翻了一會終於想明白:這樣一個遞歸函數,其實重複調用了屢次這個函數,咱們來分解一下這些步驟。百度
首先,第一次調用通過 if 後,第二次調用了該函數,假設這次調用經過 if 便可達到設定好的 return,函數返回計算出的值 X,然而此次 return 至關因而 return 到了第一次調用的gcd(b,a%b)身上,而該行代碼上沒有 return。假設輸入a=25,b=5,數據之因此正常返回,是由於這個過程裏只有第一次調用。循環
想象一套有單獨分開的出入口的俄羅斯套娃,這就至關因而在這些套娃上爲數據打開了向內的入口,而且只打開了最外部套娃的出口,因而數據便只能入不能出,故此返回的就全是 none 了。
遂將代碼改爲這樣:
1 def gcd(a,b): 2 if a%b==0: 3 return b 4 else: 5 return (gcd(b,a%b))
經過在 gcd(b,a%c) [第N次調用函數所得的值,N>=2]上增長輸出口解決了這一問題。