Python - 遞歸以及斐波那契數列


什么是遞歸?

程序調用自身的編程技巧稱為遞歸(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
''' 



使用遞歸需要注意的點:

  1. 必須要有結束條件,不然就會進入死循環
  2. 每次進入更深一層遞歸時,問題規模(計算量)相比上次遞歸都應有所減少
  3. 遞歸執行效率不高,遞歸層次過多會導致棧溢出,所以使用遞歸的時候要注意


二、斐波那契數列

斐波那契數列(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

'''


免責聲明!

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



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