求100不斷除以2直到商爲0爲止,打印每次除的商python
用循環實現:算法
n = 100 while n > 0: n = int(n/2) print(n)
輸出:編程
50 25 12 6 3 1 0
若是用函數,如何實現呢?數據結構
def calc(n): n = int(n/2) print(n) if n > 0: calc(n) # 調用本身 calc(100)
在函數內部,能夠調用其餘函數。若是一個函數在內部調用自已自己,這個函數就叫作遞歸函數。上面咱們寫的這個代碼就是遞歸。函數
遞歸的執行過程code
def calc(n): n = int(n/2) print(n) if n > 0: calc(n) print(n) calc(10)
輸出:blog
5 2 1 0 0 1 2 5
爲何輸出結果會是這樣?遞歸
如上圖所示,函數在每進入下一層的時候,當前層的函數並未結束,它必須等它調用的下一層函數執行結束返回後才能繼續往下走。 因此最下面的那句print(n)會等最裏層的函數執行時纔會執行,而後不斷往外退層,因此會出現0、一、二、5的效果。class
遞歸特性:效率
一、必須有一個明確的結束條件。
二、每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小。
三、遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出)。
遞歸在特定場景下仍是挺有用的,之後學的一些算法就得用到遞歸,好比堆排、快排等。