斐波那契數列之python(5種方法)

2021-09-17 18:27:58 字數 2667 閱讀 6609

斐波那契數列(fibonacci sequence),又稱**分割數列、因數學家列昂納多·斐波那契(leonardoda fibonacci)以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:f(1)=1,f(2)=1, f(n)=f(n-1)+f(n-2)(n>=2,n∈n*)

1、遞迴方法

def fib_recur(n):

if n<=1:

return n

else:

return fib_recur(n-1)+fib_recur(n-2)

def ex(c):

return int(c)

x=input().strip().split()

n=list(map(lambda a:int(a), x))[0]

for i in range(1, n):

print(fib_recur(i),end=' ')

寫法最簡潔,但是效率最低,會出現大量的重複計算,時間複雜度o(1.618^n),而且最深度1000

2、遞推方法

def fib_loop(n):

a,b=0,1

for i in range(n+1):

a,b=b,a+b

return a

for i in range(20):

print(fib_loop(i),end=' ')

遞推法,就是遞增法,時間複雜度是 o(n),呈線性增長,如果資料量巨大,速度會越拖越慢

3、生成器

def fib_loop_while(n):

a,b=0,1

for i in range(0,n):

a,b=b,a+b

yield a

for i in fib_loop_while(20):

print(i,end=' ')

在這裡系統解釋一下:

1、帶有yield關鍵字的函式物件 他是返回乙個列表list,list中的每個元素 都是 yield返回的每乙個值 (每次執行yield輸出值構成的列表)

2、帶有yield的函式都被看成生成器,生成器是可迭代物件,且具備__iter__ 和 __next__方法, 可以遍歷獲取元素

python要求迭代器本身也是可迭代的,所以我們還要為迭代器實現__iter__方法,而__iter__方法要返回乙個迭代器,迭代器自身正是乙個迭代器,所以迭代器的__iter__方法返回自身即可

4、類實現內部魔法方法

class fibonacci(object):

"""斐波那契數列迭代器"""

def __init__(self,n):

self.n=n

self.a=0

self.b=1

self.cur=0

def __next__(self):

"""當使用next()函式呼叫時,就會獲取下乙個數"""

5、 矩陣

res = pow((np.mat([[1, 1], [1, 0]])), n) * np.mat([[1], [0]]) #使用mat方法直接定義矩陣

return res[0][0]

for i in range(10):

print(int(fib_matrix(i)), end=' ')

print('\n')

### 2

# 使用矩陣計算斐波那契數列

def fibonacci_matrix_tool(n):

matrix = np.matrix([[1, 1], [1, 0]]) #matrix和mat函式等效

# 返回是matrix型別

return pow(matrix, n) # pow函式速度快於 使用雙星好 **

def fibonacci_matrix(n):

result_list =

for i in range(0, n):

return result_list

# 呼叫

result=fibonacci_matrix(10)

for r in result:

print(r,end=' ')

因為冪運算可以使用二分加速,所以矩陣法的時間複雜度為 o(log n)

用科學計算包numpy來實現矩陣法 o(log n)

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

python 斐波那契數列

用python寫斐波那契數列當然大家都寫的出來。當時如果用一行 寫呢。本來沒有打算用一行 寫的。後來看到有用一行 寫階乘的。reduce lambda x,y x y,i for i in range 1,n 1 當然在這之前需要 from functools import 好吧,如果你願意,就算兩...

python斐波那契數列

學習過python基礎語法,我們嘗試做乙個簡單的斐波那契數列。斐波納契數列 兩個元素的總和確定了下乙個數 a,b 0,1 while b 10 print b a,b b,a b執行以上程式,輸出 112 358end關鍵字 關鍵字end可以用於將結果輸出到同一行,或者在輸出的末尾新增不同的字元,例...