遞迴是一種函式的呼叫方式。即:自己呼叫自己。
#遞迴在某些特定的場景下使用,但是注意不能重複的無限制的對自身進行呼叫,這會引發異常。python中預設最大呼叫自身的次數為1000次:==== 函式的遞迴呼叫 ====
deffoo():
print("
foo...")
foo()
foo()
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
這裡不舉例漢諾塔遊戲,而是舉了另乙個例子,看**:
#遞迴和死迴圈實際上非常相似。但是python中的遞迴效率比迴圈的效率更低,並且迴圈能完成的事情遞迴全部都能完成。遞迴與while迴圈都有共同的特點:必須設定迴圈體的跳出。需求,將下面列表中的每乙個值取出來並且進行從小到大的排序。返回乙個單維列表
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)
(new_l)
#=== 執行結果 ===
"""[1.2, 2.2, 3, 10, 15, 50, 78, 88.6, 89.3, 99, 345]
"""
某些情況下,遞迴比迴圈更適合解決問題,就如同上面問年齡的這種情況。
import如果讀過生成器底層實現那一小結的朋友應該了解到。python函式在執行時會建立乙個棧幀,並且其中f._back所指就是上層函式的棧幀,棧幀會佔據極大的記憶體空間,它包含了當前函式中的區域性/全域性命名空間的字典,函式位元組碼等等等等資訊。sysprint(sys.getrecursionlimit()) #
1000 也是python預設的最大遞迴層次
sys.setrecursionlimit(int) #
對於普通的使用者來說並不推薦修改該數值。因為這可能導致記憶體溢位的情況
所謂尾遞迴優化是指:如果乙個函式在函式體最後一步呼叫自身,則無論呼叫多少次,只會保留乙個棧幀資訊,這樣做能夠極大的節省記憶體空間。因為自己呼叫自己棧幀都是相同的...
函式的遞迴呼叫
乙個函式在它的函式體內呼叫它自身稱為遞迴呼叫。這種函式稱為遞迴函式。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 一段 的迴圈執行的方案有兩種 方式...