1. 程式人生 > >10-Python函式之遞迴

10-Python函式之遞迴

Python函式之遞迴

 

 

主要內容:遞迴知識、遞迴例項、總結三部分

一.遞迴知識

遞迴函式就是函式自己內部呼叫自己。注意兩個知識點:

  1. 遞迴:定義函式時候,函式本身自己內部呼叫自己。
  2. 巢狀:定義函式時候,函式內部重新定義新函式。

 

    注意:1、超過最大遞迴限制的報錯,只要寫遞迴函式,必須要有結束條件

         2、返回值,不要只看到return就認為已經返回了。要看返回操作是在遞迴到第     幾層的時候發生的,然後返回給了誰。如果不是返回給最外層函式,呼叫者就接收不到。需要再分析,看如何把結果返回回來。

二.遞迴例項

  1. 二分法查詢

    通過二分法查詢列表中某一個數(二分法必須處理有序列表)

    思路:

    (1)、二分法原理:取資料中間值,中間值與目標值對比,若大於則往前繼續二分查詢,若小於則往後查詢,直至找到所給的值,跟踩雷遊戲一樣(不知道踩雷遊戲請忽略…咯咯),如從下列表中查詢55的索引值,該如何實現?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 

  1. def find(l,aim,start = 0,end = None):  #定義一個遞迴函式,  
  2.     end = len(l) if end is None else end  #
    此處end的意義?  
  3.     mid_index = (end - start)//2 + start  #尋找中間值  
  4.     if start <= end:                    #start小於end才尋找,否輸出找不到  
  5.         if l[mid_index] < aim:     #  中間值小於目標值  
  6.             return find(l,aim,start =mid_index+1,end=end)  #此處return的實際意義?  
  7.         elif l[mid_index] > aim:    #  中間值大於目標值  
  8.             return find(l, aim, start=start, end=mid_index-1)   #此處return的意義?  
  9.         else:                                         #大於小於之後返回尋找值  
  10.             return "mid_index = %d"%mid_index  
  11.     else:  
  12.         return '找不到這個值,失敗了'  
  13.     
  14. l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]  
  15. ret= find(l,66)  
  16. print(ret)  
  17.     
  18. #列印結果  
  19.     
  20. mid_index = 17  
  1. 斐波那契數列

    階乘實現斐波那契數列1、1、2、3、5、8、13……

  1. #單遞迴,運算速度快  
  2. def fib(n,l = [1]):   # n =6  
  3.     l[0] +=1  
  4.     if n ==1 or n == 2:  
  5.         l[0] -= 1  
  6.         return 1,1  
  7.     else:  
  8.         a,b = fib(n-1)  
  9.         l[0] -= 1  
  10.         print(l[0])  
  11.         if l[0] == 1:  
  12.             return a+b  
  13.         return b,a+b  
  14. print(fib(50))  
  15.     
  16.     
  17. #雙遞迴,遞迴效率低,運算複雜度大  
  18. def fib(n):  
  19.     if n==1 or n==2  
  20.         return 1  
  21.     else :  
  22.         return fib(n-1)+fib(n-2)  
  23.         
  24. print(fib(30))  

 

  1. 階乘

    Python實現階乘

  1. def fac(n):  
  2.     if n == 1 :  
  3.         return 1  
  4.     else:return n*fac(n-1)  
  5.     
  6.     
  7. print(fac(6))