小猿圈python學習 函式的遞迴

2021-09-23 23:35:45 字數 979 閱讀 9004

求100不斷除以2直到商為0為止,列印每次除的商

用迴圈實現

n = 100

while n > 0:

n = int(n/2)

print(n)

輸出:如果用函式,如何實現呢?

def calc(n):

n = int(n/2)

print(n)

if n > 0:

calc(n) #呼叫自己

calc(100)

在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自已本身,這個函式就叫做遞迴函式。上面我們寫的這個**就是遞迴

遞迴的執行過程

def calc(n):

n = int(n/2)

print(n)

if n > 0:

calc(n)

print(n)

calc(10)

輸出:為什麼輸出是這樣呢?

如上圖所示,函式在每進入下一層的時候,當前層的函式並未結束,它必須等它呼叫的下一層函式執行結束返回後才能繼續往下走。 所以最下面的那句print(n)會等最裡層的函式執行時才會執行,然後不斷往外退層,所以會出現0、1、2、5的效果

遞迴特性:

必須有乙個明確的結束條件

每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)

遞迴在特定場景下還是挺有用的,以後學的一些演算法就得用到遞迴,比如堆排、快排等,現在看還是有些複雜的,以後再講。

練習題用遞迴實現2分查詢的演算法,以從列表 a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] 查詢指定的值。

注:參***在本章最後的練習題部分,但盡量先自己先。

python小猿 小猿圈python學習 內建函式

python的len為什麼你可以直接用?肯定是直譯器啟動時就定義好了 每個函式的作用我都幫你標好了 abs 求絕對值 all return true if bool x is true for all values x in the iterable.if the iterable is empty...

小猿圈python學習 三特性之封裝

封裝可以被認為是乙個保護屏障,防止該類的 和資料被外部類定義的 隨機訪問。要訪問該類的 和資料,必須通過嚴格的介面控制。封裝最主要的功能在於我們能修改自己的實現 而不用修改那些呼叫我們 的程式片段。適當的封裝可以讓程式碼更容易理解與維護,也加強了 資料的安全性。封裝的優點 良好的封裝能夠減少耦合。類...

小猿圈python學習 用type動態建立乙個類

class person object definit self,name,age self.name name self.age age p person alex 22 上述 中,p 是通過 person 類例項化的物件,其實,不僅 p 是乙個物件,person類本身也是乙個物件,因為在pyth...