Python基礎之遞迴函式與二分法

2022-05-04 06:48:09 字數 3494 閱讀 2344

定義:

在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。

我們來舉個例子吧,比如:有個人問「egon」年齡,他說比「小大」大5歲,「小大」又說比「小保」大5歲,「小保」又說

比「小健」大5歲,最後,「小健」又問我,我又比「小健」小5歲。已知我今年20歲,求「egon」今年多少歲?

分析:看到這個題,我們首先可以發現這中間有乙個規律,就是問的這幾個人彼此間年齡的差距正好是5歲,既然,

有了這個規律,就好辦了。在看一共問了幾個人,就可以得出「egon」的年齡了。

用**表示如下:

def age(n): #形參n表示問的人數

if n == 1 : #當"n==1"時,即返回我的年齡20

return 20

else:

return age(n-1)+5 #每問乙個人,加5歲

print(age(5)) #列印"egon"的年齡,已知他問了4個人,"小大"、"小保"、"小健"、"我"加上「egon」自己共5個人

-----------------輸出結果-------------------

40 #得出"egon"的年齡

下面我們就用圖來看看具體的流程吧!

遞迴函式的特點:

1、呼叫自身函式;

2、有乙個明顯的結束條件,問題規模相比上次遞迴有所減少。

遞迴函式的優點:

定義簡單,思維邏輯簡單。理論上,所有的遞迴函式都可以寫成迴圈的方式,但是迴圈的邏輯不如遞迴清晰。

遞迴函式的缺點:

遞迴的效率不高,遞迴層次過多會導致棧溢位,預設的棧大概是1000層。

注意:使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個

函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數

過多,會導致棧溢位。

二分法是一種快速查詢的方法,複雜度低,邏輯簡單易懂,總的來說就是不斷的除以2除以2...不斷縮小範圍,快速

查詢想要的元素。

下面我們還是來舉例說明吧!

已知data是乙個按公升序排列的列表,我們要檢視乙個元素是否在列表中。

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]

**如下:

#定義遞迴函式階段

def search(num,data): #用遞迴函式使用二分法

da_index = int(len(data)/2)

da_values = data[da_index]

if len(data) > 1: #要data的長度大於1時,防止最後只剩乙個元素的特殊情況

if da_values > num : #當中間的值大於num的時候

data = data[:da_index] #我們就要取列表中間往左邊所有值的範圍

return search(num,data) #返回切後的列表給函式,繼續查詢元素

elif da_values < num : #當中間的值小於num的時候

data = data[da_index:] #我們就要取列表中間往右邊所有值的範圍

return search(num,data) #返回切後的列表給函式,繼續查詢元素

else: #不大不小就正好是要找的元素

print("已找到%s,在data中"%num)

return

else:#因為是二分查詢,特別是列表兩頭的元素,就會容易出現之下乙個的情況

if data[0] == num : #只剩下乙個元素的時候,判斷是否為要查的元素

print("已找到%s,在data中"%num)

else: #不是就走下面的**

print("sorry,data中沒有這個元素:%s"%num)

#呼叫函式階段

search(18,data) #呼叫函式,查詢18是否在data中

search(1,data) #呼叫函式,查詢1是否在data中,元素在列表最開頭位置

search(35,data) #呼叫函式,查詢35是否在data中,元素在列表最末尾位置

search(56,data) #呼叫函式,查詢56是否在data中

-----------------------輸出結果----------------------------

已找到18,在data中

已找到1,在data中

已找到35,在data中

sorry,data中沒有這個元素:56

我們在來乙個無序的元組,來查詢一下裡面是否有我們需要的元素在裡面。好了,小二上菜:

t = ("a","i","j","d","l","f","g","h","b","c","k","e")

**如下:

#定義遞迴函式階段

def search(letter,t): #用遞迴函式使用二分法

t_index = int(len(t)/2) #加上int得到元組中間索引值的整數

if len(t) > 0: #元組的長度大於0時,走下面**

if letter in t[t_index]: #當要查的元素和中間索引值的元素對應的時候,則判斷找到

print("已找到 %s,在元組t中"%letter) #列印輸出結果

return #結束函式

elif letter not in t[t_index:]: #當要查的元素沒有在右邊元組裡的時候

t = t[:t_index] #重新定義選定的範圍在中間索引值的左邊的元組

return search(letter,t) #結束函式,返回得到結果,重新呼叫函式

elif letter not in t[:t_index]: #當要查的元素沒有在左邊元組裡的時候

t = t[t_index:] #重新定義選定的範圍在中間索引值的右邊的元組

return search(letter,t) #結束函式,返回得到結果,重新呼叫函式

else: #當t長度為0的時候,說明裡面沒有值了,就說明要查的元素沒在元組t中

print("sorry, t 中沒有這個元素:%s" % letter) #列印輸出結果

#呼叫函式階段

search("j",t) #呼叫函式,查詢"j"是否在t中

search("a",t) #呼叫函式,查詢"a"是否在t中,元素在最開頭的位置

search("e",t) #呼叫函式,查詢"e"是否在t中,元素在最末尾的位置

search("z",t) #呼叫函式,查詢"z"是否在t中

-----------------------輸出結果---------------------

已找到 j,在元組t中

已找到 a,在元組t中

已找到 e,在元組t中

sorry, t 中沒有這個元素:z

注意:二分法查詢非常快且非常常用,二分法查詢的前提必須待查詢的序列是乙個有序的。

python基礎之遞迴函式

在python中我們使用函式經常是去呼叫別的函式,但是遞迴函式不一樣,它是 自己去呼叫自己 如果不了解遞迴的可以看下電影盜夢空間,相信會對理解遞迴函式有幫助。遞迴函式的條件有兩個 1.必須給遞迴函式乙個出口,否則會無限呼叫,耗費記憶體 2.對自己的遞迴條件作大膽假設 下面我們計算數學上經常計算的階乘...

Python基礎之遞迴函式

什麼是遞迴函式?遞迴 recursion 1.是乙個函式 2.函式執行的過程中,自己呼叫自己 3.遞迴一定有結束呼叫自己的條件 4.遞迴效率不高 5.什麼問題必須用遞迴?漢諾塔 6.不會死迴圈,有最大遞迴次數限制,會報錯 recursionerror maximum recursion depth ...

筆記 python基礎之遞迴函式

學習要求 能看懂遞迴 能知道遞迴的應用場景 遞迴函式 了解什麼是遞迴 在函式中呼叫自身函式 最大遞迴深度預設是997 998 是python從記憶體角度出發做得限制 while true print 從前有座山 def story print 從前有座山 story print 111 story ...