遞歸該怎么寫(一)


遞歸定義

遞歸:無限調用自身這個函數,每次調用總會改動一個關鍵變量,直到這個關鍵變量達到邊界的時候,不再調用。

我們現在開始來舉例子,然后總結如何寫好遞歸程序。(這種針對可以找出數學表達式的遞歸程序,對於寫不出數學表達式的或者不好找的會在之后的博客中補充)

例子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 = 等號)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM