python 遞迴與二分法

2021-08-15 06:32:29 字數 2286 閱讀 7320

一 、遞迴呼叫的定義

#遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫
二、遞迴分為兩個階段:遞推,回溯

#**。。。

# salary(5)=salary(4)+300

# salary(4)=salary(3)+300

# salary(3)=salary(2)+300

# salary(2)=salary(1)+300

# salary(1)=100

## salary(n)=salary(n-1)+300 n>1

# salary(1) =100 n=1

def salary(n):

if n == 1:

return 100

return salary(n-1)+300

print(salary(5))

三、python中的遞迴效率低且沒有尾遞迴優化

#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()

雖然可以設定,但是因為不是尾遞迴,仍然要儲存棧,記憶體大小一定,不可能無限遞迴

五、二分法

想從乙個按照從小到大排列的數字列表中找到指定的數字,遍歷的效率太低,

用二分法(演算法的一種,演算法是解決問題的方法)可以極大低縮小問題規模

實現類似in的效果

l=[1,2,10,30,33,99,101,200,301,402] #從小到大排列的數字列表

def search(num,l):

print(l)

if len(l) > 0:

mid=len(l)//2

if num > l[mid]:

#in the right

l=l[mid+1:]

elif num < l[mid]:

#in the left

l=l[:mid]

else:

print('find it')

return

search(num,l)

else:

#如果值不存在,則列表切為空

print('not exists')

return

search(100,l)

實現類似於l.index(30)的效果

l=[1,2,10,30,33,99,101,200,301,402]

def search(num,l,start=0,stop=len(l)-1):

if start <= stop:

mid=start+(stop-start)//2

print('start:[%s] stop:[%s] mid:[%s] mid_val:[%s]' %(start,stop,mid,l[mid]))

if num > l[mid]:

start=mid+1

elif num < l[mid]:

stop=mid-1

else:

print('find it',mid)

return

search(num,l,start,stop)

else: #如果stop > start則意味著列表實際上已經全部切完,即切為空

print('not exists')

return

search(301,l)

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python之遞迴與二分法

1.遞迴 自己呼叫自己 遞迴的入口 引數 和 出口 return 樹形結構的遍歷 import osdef func lujing,n lst os.listdir lujing 開啟資料夾,列出所有檔案 for el in lst el 每乙個檔案 path os.path.join lujing...

python基礎 遞迴與二分法

一般換做巢狀函式換做自己執行自己 1,必須有乙個明確的結束條件 2,每次進入新一層遞迴時,問題規模比上次遞迴都應有所減少 3,效率不高,層次過多導致棧溢位 所以,要寫遞迴函式主要邏輯必需不斷呼叫,而遇到if 條件必須終止 二分法 data 1,3,6,7,9,12,14,16,17,18,20,21...