1. 程式人生 > >python之函數遞歸

python之函數遞歸

接收 最終 ont pop rest turn list 彈出 size

函數遞歸調用

在函數內部,可以調用其它函數,如果一個函數在內部調用自身,即是遞歸調用

為防止無限遞歸類似於死循環,需要如下:
  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之函數遞歸