遞歸函數
(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循環),所以很少使用。