python遞迴呼叫可以多少層 函式遞迴呼叫

2021-10-11 22:11:38 字數 2117 閱讀 1692

函式的遞迴呼叫

在呼叫乙個函式的過程中直接或間接地呼叫到了本身。函式的遞迴呼叫本質就是乙個迴圈的過程(用函式實現的迴圈)。

遞迴呼叫必須在滿足某種條件下結束,不能無限遞迴呼叫下去。

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 利用遞迴求兔子序列 斐波那契數列,分割數列 有人想知道一年內一對兔子可繁殖成多少對,便築了一道圍牆把一對兔子關在裡面。已知一對兔子每乙個月可以生一對小兔子,而一對兔子出生後...