【python】關於函式遞迴使用 return 後,收到資料為 None
阿新 • • 發佈:2018-12-12
在寫一個輾轉相除求最小公因數的程式的時候,突然發現自己不管怎麼寫(除了兩數恰巧可以整除),return 返回的值恆為 none。
程式碼為此:
1 def gcd(a,b): 2 if a%b==0: 3 return b 4 else: 5 gcd(b,a%b)
總之除錯一下,得到的結果是各部分輸出正常。
然後用迴圈做了一遍:
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。結果正確。
於是可以肯定,演算法沒有問題,但是不服氣啊,憑什麼遞迴做不出來,擺著試試的想法,把return換成了print。輸出正常。
然後就更加摸不著頭腦了,為什麼 print 可以,你 return 就不行。
於是開始百度 Return 的用法,呼叫函式的時候,如果沒有執行 return 命令(或 return 命令未接收資料),預設會返回 none
翻了一會終於想明白:這樣一個遞迴函式,其實重複呼叫了多次這個函式,我們來分解一下這些步驟。
首先,第一次呼叫經過 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]上增加輸出口解決了這一問題。