求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...