時間複雜度
def fibonacci(n):
if n == 1:
return 1
elif n == 2:
return 1
elif n > 2:
return fibonacci(n-1)+fibonacci(n-2)
for n in range(1,100):
print(n,':', fibonacci(n))
時間複雜度
fibonacci_cache = {}
def fibonacci(n):
if n in fibonacci_cache:
return fibonacci_cache[n]
if n == 1:
value = 1
elif n == 2:
value = 1
elif n > 2:
value = fibonacci(n-1) + fibonacci(n-2)
fibonacci_cache[n] = value
return value
for n in range(1,100):
print (n,':', fibonacci(n))
時間複雜度
def fibonacci(n):
if n == 1:
return 1
elif n == 2:
return 1
a = 1
b = 2
tmp = 0
for i in range(3,n):
tmp = a + b
a = b
b = tmp
return tmp
for n in range(1,100):
print(n,':', fibonacci(n))
from functools import lru_cache
@lru_cache(maxsize = 1000, typed=false)
def fibonacci(n):
if n == 1:
return 1
elif n == 2:
return 1
elif n > 2:
return fibonacci(n-1)+fibonacci(n-2)
for n in range(1,100):
print(n,':', fibonacci(n))
lru: least recently used cache. 即為字面意思,儲存快取中的資料,下次用到時直接呼叫,也是動態規劃空間換時間的思想。引數如下:
maxsize: 是儲存最近的多少個快取中的結果,預設為 128。
type: type 如為 true,即把不同引數型別得到的結果分開儲存,如 f(3) 和 f(3.0) 會被區分開。
時間複雜度
首先,斐波那契數列遞推公式為:
用矩陣運算形式表示為:
那麼進一步推導:
所以求和問題轉化為求矩陣冪的問題。此處求矩陣冪用二分法,**中使用的是遞迴方法求矩陣冪。
from numpy import *
import numpy as np
def mat_power(matrix, n):
if n == 1:
return matrix
if n % 2 == 0:
tmp = mat_power(matrix, n/2)
return np.dot(tmp,tmp)
else:
tmp = mat_power(matrix, floor(n/2))
return np.dot(np.dot(tmp,tmp),matrix)
def fibonacci(n):
a = array([[1,1],[1,0]],dtype=object)
#注意這裡dtype=object,預設為int64。當n>93時,int64會overflow。
if n == 1:
return 1
elif n == 2:
return 1
else:
result = np.dot(mat_power(a, n-2), array([[1],[1]]))
return int(result[0])
for n in range(1,100):
print(n,':', fibonacci(n))
斐波那契數列解法
方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...
斐波那契數列解法
1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...
斐波那契數列 題解
原題出自ural 1133。題目大意 擴充套件斐波那契數列在整數集上的定義,即不是從f0 0,f1 1 這樣子開始的,下標可以是任意整數。給定這樣乙個序列中的兩個下標,i,j,以及他們在序列中對應的值fi fj 然後要求fn n是輸入的乙個數字 思路1 由於題目裡說到資料範圍在 2 109 fk 2...