遞歸定義函數
遞歸:無限調用自身這個函數,每次調用總會改動一個關鍵變量,直到這個關鍵變量達到邊界的時候,再也不調用。spa
咱們如今開始來舉例子,而後總結如何寫好遞歸程序。(這種針對能夠找出數學表達式的遞歸程序,對於寫不出數學表達式的或者很差找的會在以後的博客中補充)3d
例子1: n的階乘。code
咱們先來寫出數學表達式blog
代碼部分:遞歸
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: 斐波那契數列get
咱們仍是來寫數學表達式,嘿嘿。博客
相應代碼:數學
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 :求最大公約數class
老樣子,先寫數學表達式。是否是感受沒啥難度了(能夠用數學表達出來的)
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 = 等號)