遞歸函數的定義和幾個小例子


遞歸函數

(1)什么是遞歸函數?

我們都知道,一個函數可以調用其他函數。如果這個函數在內部調用它自己,那么這個函數就叫遞歸函數。

(2)遞歸函數的作用

舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * ... * n

 1 #不使用遞歸的方法:
 2 n=4      #求4的階乘
 3 result=1
 4 i=1
 5 while i<=4:  6     result=result*i  7     i+=1
 8  
 9 print(result) 10 
11 #使用遞歸的方法:
12 def test1(n):#定義函數來計算數字n的階乘
13     if n==1: 14         return 1
15     return n * test1(n-1) 16  
17 print(test1(5)) 18 #1在函數的內部調用自己本身
19 #2遞歸函數本質是一個方法的循環調用,注意:有可能出現死循環
20 #3一定要定義遞歸的邊界(什么時候退出循環)

 

 

輸出結果為:

1 24
2 120
3 [Finished in 0.4s]

 

從上面兩中方法的對比可以看出,遞歸函數的作用和循環的方法效果一樣,即遞歸函數本質上是一個方法的循環調用,注意:有可能會出現死循環。因此,使用遞歸函數時,一定要定義遞歸的邊界(即什么時候退出循環)。

遞歸函數的另一個案例是斐波納契數列。

斐波納契數列:1,1,2,3,5,8,13。。。(該數列中,有n個數字,從第三個數字開始:數值 =前一個數字 + 前面一個數字)

即,n=(n-2)+(n-1)

 1 def get_num(n):#獲取斐波拉契數列中第n個數字的值
 2     if n==1 or n==2:  3         return 1
 4     return get_num(n-1) + get_num(n-2)  5  
 6 #把獲取的斐波拉契數字存放到列表中
 7 nums=[]  8 for i in range(1,21):  9     nums.append(get_num(i))#get_num獲得一個斐波拉契數字
10  
11 print(nums)

輸出結果為:

1 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765] 2 [Finished in 0.4s]

以上兩個案例是遞歸函數的經典案例,需要記住其使用方法。注意:在實際使用中,遞歸函數由於消耗時間比較長(相比for循環和while循環),所以很少使用。

 


免責聲明!

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



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