什么是遞歸?
程序調用自身的編程技巧稱為遞歸(recursion),遞歸說通俗一點,就是自己調用自己。
舉例子:舉個網上的例子
一個小朋友坐在第10排,他的作業本被小組長拿到了第1排,小朋友要拿回他的作業本,可以怎么辦?他可以拍拍第9排小朋友,說:“幫我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,說:“幫我拿第1排的本子”...如此下去,消息終於傳到了第1排小朋友那里,於是他把本子遞給第2排,第2排又遞給第3排...終於,本子到手啦!這就是遞歸,拍拍小朋友的背可以類比函數調用,而小朋友們都記得要傳消息、送本子,是因為他們有記憶力,這可以類比棧。
一、階乘運算
實現階乘運算: n...5x4x3x2x1
'''
n...5*4*3*2*1
n*(n-1)
'''
def fac(n):
if n==1:
return 1
else:
return n*fac(n-1)
print(fac(4))
'''
代碼運行過程:
n = 4, 運行這行代碼 return n*fab(n-1) --> 4*fac(3), 接着調用自身函數 fac()
n = 3, 運行這行代碼 return n*fab(n-1) --> 4*3*fac(2), 接着調用自身函數 fac()
n = 2, 運行這行代碼 return n*fab(n-1) --> 4*3*2fac(1), 接着調用自身函數 fac()
n = 1, fac(1)=1 --> 4*3*2fac(1) --> 4*3*2*1
'''
使用遞歸需要注意的點:
- 必須要有結束條件,不然就會進入死循環
- 每次進入更深一層遞歸時,問題規模(計算量)相比上次遞歸都應有所減少
- 遞歸執行效率不高,遞歸層次過多會導致棧溢出,所以使用遞歸的時候要注意
二、斐波那契數列
斐波那契數列(Fibonacci sequence),又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……
查找規律:
f(1)=1
f(2)=1
...
f(n)=f(n-1)+f(n-2) n >3
代碼:
def fib(n):
''' 斐波那契數列 '''
if n <= 2:
''' 數列前兩個數都是1 '''
r = 1
return r # 返回結果,並結束函數
else:
r = fib(n-1)+fib(n-2) # 由數據的規律可知,第三個數的結果都是前兩個數之和,所以進行遞歸疊加
return r # 返回結果,並結束函數
# print(fab(4)) # 3,調用函數並打印結果
'''
執行過程分析:
傳入的 n=4, 執行: r = fib(n-1)+fib(n-2) ---> fib(3)+fib(2)
fib(3)+fib(2) ---> fib(3) 執行后 ---> fib(2)+fib(1); fib(2)=1; fib(1)=1
所以: fib(3)+fib(2) = fib(2)+fib(1)+fib(2) = 1+1+1 =3
'''