遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫
age(5) = age(4) + 2age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18
age(n)=age(n-1)+2 #n>1
age(1)=18 #n=1
##########################3
def age(n):
if n == 1:
return 18
return age(n - 1) + 2
print(age(5))
#python中的遞迴python中的遞迴效率低,需要在進入下一次遞迴時保留當前的狀態,在其他語言中可以有解決方法:尾遞迴優化,即在函式的最後一步(而非最後一行)呼叫自己,尾遞迴優化:
但是python又沒有尾遞迴,且對遞迴層級做了限制
#總結遞迴的使用:
1. 必須有乙個明確的結束條件
2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3. 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)
import syssys.getrecursionlimit()
sys.setrecursionlimit(2000)
n=1def test():
global n
print(n)
n+=1
test()
test()
雖然可以設定,但是因為不是尾遞迴,仍然要儲存棧,記憶體大小一定,不可能無限遞迴
應用:把列表所有的內容取出來l = [1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15, [16, [17, ]], 19]]]]]]]
def search(l):
for item in l:
if type(item) is list:
search(item)
else:
print(item)
search(l)
想從乙個按照從小到大排列的數字列表中找到指定的數字,遍歷的效率太低,用二分法(演算法的一種,演算法是解決問題的方法)可以極大低縮小問題規模
l = [1, 2, 5, 7, 10, 31, 44, 47, 56, 99, 102, 130, 240]+++++++++++++++++++++++++++++++++++
a=len(l) //2
print(a)#6
print(len(l))#13
print(l[6:]) #[44, 47, 56, 99, 102, 130, 240]
print(l[:6]) #[1, 2, 5, 7, 10, 31]
+++++++++++++++++++++++++++++++++++
def binary_search(l, num):
print(l) # [10, 31]
if len(l) > 1: #如果列表的長度大於一,就執行下面的遞迴操作
mid_index = len(l) // 2 # 把列表切分成兩半,拿到中間值的索引 44的索引為6
if num > l[mid_index]: # 使用者要找的值跟中間那個值比較,如果大於中間值,那麼這個值在列表右邊
l = l[mid_index:] # l=[31],切分,去右邊找值
binary_search(l, num) # 遞迴一次,規模減少一半
elif num < l[mid_index]: # 如果是小於中間值的話,那麼這個值就在列表的左邊
l = l[:mid_index] # 切分
binary_search(l, num)
else:
print('find it')
else:
if l[0] == num:##如果列表中就存在乙個值,如果這個值就是我要找的那個值,就直接列印
print('find it')
else:
print('not exist')
return
binary_search(l, 32)
l = [1, 2, 5, 7, 10, 31, 44, 47, 56, 99, 102, 130, 240]def binary_search(l, num):
print(l)
if len(l) == 1:
if l[0] == num:
print('find it')
else:
print('not exists')
return
mid_index = len(l) // 2
mid_value = l[mid_index]
if num == mid_value:
print('find it')
return
if num > mid_value:
l = l[mid_index:]
if num < mid_value:
l = l[:mid_index]
binary_search(l, num)
binary_search(l, 32)
Day 5 Python 基礎學習
python open 方法用於開啟乙個檔案,並返回檔案物件,在對檔案進行處理過程都需要使用到這個函式,如果該檔案無法被開啟,會丟擲 oserror。注意 使用 open 方法一定要保證關閉檔案物件,即呼叫 close 方法。open 函式常用形式是接收兩個引數 檔名 file 和模式 mode o...
第三週 Day 5 Python資料持久化
1.檔案上下文with open as 檔案物件 檔案上下文 可以操作檔案的位置 with open test.txt encoding utf 8 as f f.read f.read f.read valueerror i o operation on closed file.2.資料持久化方法...
day16 python之匿名函式,遞迴函式
匿名函式格式 函式名 lambda 引數 返回值 引數可以有多個,用逗號隔開 匿名函式不管邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值 返回值和正常的函式一樣可以是任意資料型別 我們可以看出,匿名函式並不是真的不能有名字。匿名函式的呼叫和正常的呼叫也沒有什麼分別。就是 函式名 引數 就可...