遞歸定義
遞歸:無限調用自身這個函數,每次調用總會改動一個關鍵變量,直到這個關鍵變量達到邊界的時候,不再調用。
我們現在開始來舉例子,然后總結如何寫好遞歸程序。(這種針對可以找出數學表達式的遞歸程序,對於寫不出數學表達式的或者不好找的會在之后的博客中補充)
例子1: n的階乘。
我們先來寫出數學表達式
代碼部分:
1 __author__ = "WSX" 2 3 def f(n): 4 if n == 1: 5 return 1 6 else: 7 return f(n-1) * n 8 9 print(f(3))
例子 2: 斐波那契數列
我們還是來寫數學表達式,嘿嘿。
相應代碼:
1 __author__ = "WSX" 2 def fib(n): 3 if n == 1: 4 return 1 5 if n == 2: 6 return 1 7 if n>2: 8 return fib(n-2) + fib(n-1) 9 print(fib(4))
例子3 :求最大公約數
老樣子,先寫數學表達式。是不是感覺沒啥難度了(可以用數學表達出來的)
return 就是等號 !!!
代碼:
1 __author__ = "WSX" 2 3 def gcb(a, b): 4 if a%b == 0: 5 return b 6 else: 7 return gcb(b, a%b)
到了這里是不是對於這種類型的遞歸已經能十分簡單的寫出來了? 我們在看一個稍微高級一點點的例子
例子4: 二分查找
寫表達式,你會想這個表達式怎么寫??? 下面我們來看。
代碼:
1 __author__ = "WSX" 2 3 def s(L , left , right , target): 4 mid = (left + right) // 2 5 if target == L[mid]: 6 return mid 7 if left > right: 8 return None 9 if target > L[mid]: 10 return s(L,mid+1 , right,target) 11 else: 12 return s(L, left, mid-1, target) 13 L = [3,5,7,8,55,88] 14 print(s(L, 0 ,len(L),88))
我總結的經驗是:
① 確定需要遞歸的參數
② 寫出遞歸的表達式(一定找到出口) 就是結束的條件
③ 將表達式轉化為代碼(函數名 = 表達式左側 函數內部 = 表達式右側 return = 等號)