一 、遞迴呼叫的定義
#遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫
二、遞迴分為兩個階段:遞推,回溯
#**。。。
# 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...