Python函數編程——遞歸

Python函數編程——遞歸

求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)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出)。

遞歸在特定場景下仍是挺有用的,之後學的一些算法就得用到遞歸,好比堆排、快排等。

相關文章
相關標籤/搜索