函式的遞迴呼叫

2022-01-10 15:37:25 字數 2035 閱讀 9570

遞迴是一種函式的呼叫方式。即:自己呼叫自己。

#

==== 函式的遞迴呼叫 ====

deffoo():

print("

foo...")

foo()

foo()

遞迴在某些特定的場景下使用,但是注意不能重複的無限制的對自身進行呼叫,這會引發異常。python中預設最大呼叫自身的次數為1000次:

recursionerror: maximum recursion depth exceeded while calling a python object
除開上述的自己呼叫自己,還有一種呼叫方式為間接呼叫自己:

#

==== 函式的遞迴呼叫方式二 ====

函式遞迴必須經歷兩個階段,他們就是回溯與遞推階段。當函式不斷遞迴呼叫自身時的階段被稱為回溯階段,當函式退出遞迴呼叫時的階段被稱為遞推階段。

**表現形式為:

#

==== 回溯與遞推案例 ====

defage(n):

if n == 1:

return 18

return age(n-1) + 10res = age(5)

print(res) #

58

著名的漢諾塔遊戲:感興趣的可以搜尋一下這個遊戲。可以用遞迴求出遊戲結果

這裡不舉例漢諾塔遊戲,而是舉了另乙個例子,看**:

#

需求,將下面列表中的每乙個值取出來並且進行從小到大的排序。返回乙個單維列表

l = [10,1.2,[3,345,2.2,[15,[88.6,[78,[89.3,99,[50]]]]]]]

new_l =

defmy_sort(list1):

for i in

list1:

ifisinstance(i,list):

my_sort(i)

else

: new_l.sort()

my_sort(l)

print

(new_l)

#=== 執行結果 ===

"""[1.2, 2.2, 3, 10, 15, 50, 78, 88.6, 89.3, 99, 345]

"""

遞迴和死迴圈實際上非常相似。但是python中的遞迴效率比迴圈的效率更低,並且迴圈能完成的事情遞迴全部都能完成。遞迴與while迴圈都有共同的特點:必須設定迴圈體的跳出。

某些情況下,遞迴比迴圈更適合解決問題,就如同上面問年齡的這種情況。

import

sysprint(sys.getrecursionlimit()) #

1000 也是python預設的最大遞迴層次

sys.setrecursionlimit(int) #

對於普通的使用者來說並不推薦修改該數值。因為這可能導致記憶體溢位的情況

如果讀過生成器底層實現那一小結的朋友應該了解到。python函式在執行時會建立乙個棧幀,並且其中f._back所指就是上層函式的棧幀,棧幀會佔據極大的記憶體空間,它包含了當前函式中的區域性/全域性命名空間的字典,函式位元組碼等等等等資訊。

所謂尾遞迴優化是指:如果乙個函式在函式體最後一步呼叫自身,則無論呼叫多少次,只會保留乙個棧幀資訊,這樣做能夠極大的節省記憶體空間。因為自己呼叫自己棧幀都是相同的...

函式的遞迴呼叫

乙個函式在它的函式體內呼叫它自身稱為遞迴呼叫。這種函式稱為遞迴函式。c語言允許函式的遞迴呼叫。在遞迴呼叫中,主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身。每呼叫一次就進入新的一層。例如有函式f如下 int f int x 這個函式是乙個遞迴函式。但是執行該函式將無休止地呼叫其自身,這當然是不正...

函式的遞迴呼叫

遞迴函式 呼叫自己本身的函式叫遞迴函式 實現如下 main.c define crt secure no warnings include include 遞迴列印字串逆序 int reverse char str if str 0 判斷遞迴結束條件 reverse str 1 printf c s...

函式的遞迴呼叫

函式的遞迴呼叫 是函式巢狀呼叫的一種特殊形式 具體是指 在呼叫乙個函式的過程中又直接或者間接地呼叫到本身 直接呼叫本身 deff1 print 是我是我還是我 f1 f1 間接接呼叫本身 deff1 print f1 f2 deff2 print f2 f1 f1 一段 的迴圈執行的方案有兩種 方式...