python之函數遞歸
函數遞歸調用
在函數內部,可以調用其它函數,如果一個函數在內部調用自身,即是遞歸調用
為防止無限遞歸類似於死循環,需要如下:
1、必須要有一個明確的返回值;
2、每次進入更深一層遞歸時,問題規模應該比上次遞歸都有所減少;
3、遞歸效率不高,當層次過多會導致棧溢出
例如:
def calc(n):
print(n)
if int(n/2) == 0:
return n
res=calc(int(n/2))
return res
v=calc(10)
print(v)
返回結果:
10
5
2
1
1
程序執行過程:
調用calc()函數,傳入參數10;calc()函數第一次執行;
進入calc函數,打印10
判斷不滿足
再次調用calc函數傳入參數5,calc()函數第二次執行;
此時第一次calc函數在等待第二次calc函數的返回結果賦值給res
第二次calc函數執行:
打印5
判斷不滿足
執行第三次calc函數,傳入參數2,calc()函數第三次執行;
此時第二次calc函數在等待第三次calc函數的返回結果賦值給res
第三次calc函數執行:
打印2
判斷不滿足
執行第四次calc函數,傳參數1,calc()函數第四次執行;
此時第三次calc函數在等待第四次calc函數的返回結果賦值給res
第四次calc函數執行:
打印1
判斷成立,執行return 1
第四次calc函數執行完畢,把1返回給第三次calc函數
第三次calc函數在等待第四次函數的返回結果;
第四次calc函數返回了1
第三次calc函數拿到結果後賦值給res;
第三次calc函數執行return 1返回給第發給次函數
************************
第二次calc函數在等待第三次函數的返回結果;
第三次calc函數返回了1
第二次calc函數把1賦值給res
第二次calc函數執行return 1返回給第一次函數
************************
第一次calc函數在等待第二次函數的返回結果;
第二次calc函數返回了1
第一次calc函數把1賦值給rest
第一次calc函數執行return 1返回給調用它的程序
************************
程序接收到了結果1賦值給變量v
最後打印變量
#遞歸實例:問路
問路最終分為2種情況:
- 問到最後沒人知道;
- 問到某個人時知道;
- 現在假設有個人物列表代表問路時需要問的人
- 假設問到最後Tom知道路
person_list=["zhangsan","lisi","Tom"] #路人列表,需要被問到的人
def find_way():
if len(person_list) == 0:
return "No one know the way" #問到最後沒人知道
person=person_list.pop(0) #依次彈出1個人去問
if person == "Tom": #只有Tom才知道,彈出的人不是Tom,表示不知道,需要問下一個人
return "%s said:I know the way,over there" %person
res=find_way()
return res
v=find_way()
print(v)
返回結果:
Tom said:I know the way,over there
python之函數遞歸