函式的遞迴呼叫
在呼叫乙個函式的過程中直接或間接地呼叫到了本身。函式的遞迴呼叫本質就是乙個迴圈的過程(用函式實現的迴圈)。
遞迴呼叫必須在滿足某種條件下結束,不能無限遞迴呼叫下去。
1、直接呼叫自身:
def f1():
print('from f1')
f1()
2、間接呼叫自身:
def f1():
print('from f1')
f2()
def f2():
print('from f2')
f1()
python不是一門函式式程式語言,無法對遞迴進行尾遞迴優化。尾遞迴優化,即在函式的最後一步(而非最後一行)呼叫自己。
在python中,每呼叫一次函式就會在記憶體產生乙個區域性命名空間,所以為了防止遞迴死迴圈造成記憶體溢位,python對遞迴的最大深度做了限制,預設為1000層。
# 檢視最大深度。
import sys
print(sys.getrecursionlimit())
# 設定最大深度,但仍受限於作業系統棧大小的限制,不推薦修改。
sys.setrecursionlimit()
遞迴的兩個階段
例如要求出第乙個人年齡,這個人比第二個人大10歲,第二個人又比第三個人大10歲,第三個人比第四個人大10歲,第四個人比第五個人大十歲,而第五個人的年齡為18歲,那麼我們要求第乙個人的年齡,就是:
man1 = man2 + 10
man2 = man3 + 10
man3 = man4 + 10
man4 = man5 + 10
man5 = 10
用**來寫就是這樣:
def age(n):
if n == 1:
return 18
return age(n-1) + 10
執行過程:
回溯階段
不斷的向下一層函式遞進,這個過程稱為回溯。
print(age(5))
# age(5) -> age(4) -> age(3) -> age(2) -> age1(1)
遞推階段
滿足結束條件,逐層返回值,這個過程稱為遞推。
age(5)
58 遞迴應用
在寫**時,如果出現某個功能需要重複呼叫自身,這個時候就可以使用到遞迴。
二分法對乙個從小到大排序的有序數字元素列表,查詢某個值在列表中的所在位置。若使用遍歷查詢,那麼時間複雜度為o(n)。我們可以使用二分法查詢,每次將值與列表中間的元素比較,若值比中間元素大,則下次從右邊查詢即可;若值比中間元素小,下次從左邊查詢即可。每次將值與列表的中間值比較,直到找到該值或無該值。
列表為:
l = [-4,-1,0,1,5,8,9,2,8,12,62,23,63]
python實現二分法:
def dichotomy(n,num_list):
# 對列表排序。
num_list.sort()
if len(num_list) == 0:
# 表示列表為空,無該值.
return
median = len(num_list) // 2
if n > num_list[median]:
# 如果值大於中間值。
new_list = num_list[median+1:]
dichotomy(n,new_list)
elif n < num_list[median]:
# 如果值小於中間值。
new_list = num_list[:median]
dichotomy(n,new_list)
else:
# 不大不小表示找到該值。
print(f' index is ')
階乘乙個正整數的階乘(factorial)是所有小於及等於該數的正整數的積,並且0的階乘為1。自然數n的階乘寫作n!。
任何大於等於1 的自然數n 階乘表示方法:
n! = n * n(n-1)!
python**實現:
def factorial(n):
if n == 1:
return n
return factorial(n-1) * n
Python 函式遞迴呼叫
案例一 漢諾塔 例一 def move n,a,buffer,c if n 1 print move a,c else move n 1,a,c,buffer move 1,a,buffer,c move n 1,buffer,a,c move 3,a b c 例二 def hanoi n,x,y,...
caffe 如何呼叫python層
這兩天一直在研究faster rcnn的原始碼,可是依舊感覺雲裡霧裡,故下定決心把caffe呼叫python layer的流程仔細走一遍,好明白到底是什麼在呼叫python layer。話說 linux 除錯還真是蛋疼啊,木有ide那樣直接下斷點,gdb又不會用,只能傻比比的不斷的log info ...
python中的遞迴呼叫
1 利用遞迴呼叫求n!def p n if n 0 or n 1 return 1 else return n p n 1 2 利用遞迴求兔子序列 斐波那契數列,分割數列 有人想知道一年內一對兔子可繁殖成多少對,便築了一道圍牆把一對兔子關在裡面。已知一對兔子每乙個月可以生一對小兔子,而一對兔子出生後...