一、什么是遞回?
函式的遞回呼叫:是函式嵌套呼叫的一種特殊形式
具體是指,在呼叫一個函式的程序中又直接或者間接的呼叫到本身,
def f1():
print('我直接調我自己")
f1()
f1() # 遞回就是函式的回圈,但是每一層都沒有結束,不斷的申請記憶體空間,最侄訓導致記憶體溢位,Python規定了最多遞回2000層,
-----------------------------------------------------------------------------------------------------------》
def f1():
print("我是f1,我調f2,但是我最侄訓間接調我自己”)
f2()
def f2():
print("我是f2,我調f1")
f1()
f1() # f1 通過呼叫f2最終間接呼叫自己,
-------------------------------------------------------------------------------------------------------------》
所以呢,回圈的方式有兩種啊,一個是通過for 和 while, 一個是通過遞回,遞回在有些情況下會非常簡單,
但是使用遞回呢,需要注意,遞回不應該無限的呼叫下去,一定要設定一個結束條件,
def f1():
if n == 10:
return
print(n)
n+=1
f1(n)
f1(0)
二、什么是遞回的兩個階段?
1.回溯 一層一層呼叫下去的程序叫做回溯,往下回溯
2.遞推 往下回溯的程序中,終于到達結束條件后,再一層一層往回結束,這個一層一層往回推的程序叫做遞推,

f1 : f 函式 第一層
f2 : f 函式 第二層
....
f5 : f 函式 第五層 第五層的時候拿到了結束條件,得到一個值,然后從第五層開始往回遞推,一層層結束,
三、遞回的應用
l = [1,2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]] # 將l中每一個元素 都取出來,
# 先定義一個取單個元素的函式
l1 = []
def func(l):
for i in l: # 遇到l 里頭嵌套串列怎么辦?
if type(i) == list:
func(i)
else:
l1.append(i)
return l1
res = func(l)
print(res) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
三、遞回的應用---二分法
# 有一個順序存放數字的串列l,任意給一個值,判斷是否在串列中,
def find_num(l,num):
print(l)
if len(l) != 0:
index_num = len(l) // 2
if num == l[index_num]:
print(f'數字{num}存在')
return
if num > l[(index_num)]:
l = l[index_num+1:]
find_num(l,num)
if num < l[index_num]:
l = l[:index_num]
find_num(l,num)
else:
print('找不到')
return
l = [1, 2, 5, 8, 9, 12, 13, 16, 25, 31, 42, 54, 55, 66, 77, 91]
num = 14
find_num(l,num)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71713.html
標籤:Python
