day5 python之遞迴與二分法

2022-09-17 02:33:07 字數 2857 閱讀 5685

遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫

age(5) = age(4) + 2

age(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 sys

sys.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 引數 返回值 引數可以有多個,用逗號隔開 匿名函式不管邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值 返回值和正常的函式一樣可以是任意資料型別 我們可以看出,匿名函式並不是真的不能有名字。匿名函式的呼叫和正常的呼叫也沒有什麼分別。就是 函式名 引數 就可...