【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)

  總之調試一下,獲得的結果是各部分輸出正常。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]上增長輸出口解決了這一問題。

相關文章
相關標籤/搜索