1. 程式人生 > >【python】關於函式遞迴使用 return 後,收到資料為 None

【python】關於函式遞迴使用 return 後,收到資料為 None

在寫一個輾轉相除求最小公因數的程式的時候,突然發現自己不管怎麼寫(除了兩數恰巧可以整除),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]上增加輸出口解決了這一問題。