遞歸該怎麼寫(一)

遞歸定義函數

遞歸:無限調用自身這個函數,每次調用總會改動一個關鍵變量,直到這個關鍵變量達到邊界的時候,再也不調用。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 = 等號)

相關文章
相關標籤/搜索