[原題鏈結]寫乙個函式,輸入 n ,求斐波那契(fibonacci)數列的第 n 項。斐波那契數列的定義如下:
f(0) = 0, f(1) = 1
f(n) = f(n - 1) + f(n - 2), 其中 n > 1.
斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。
示例 1:
輸入:n = 2
輸出:1
示例 2:
輸入:n = 5
輸出:5
提示:0 <= n <= 100
注意:本題與leetcode主站 509 題相同:
斐波那契數列的定義是: f(n+1)=f(n)+f(n-1)
思路1:遞迴
把 f(n) 問題的計算拆分成 f(n-1) 和 f(n-2) 兩個子問題的計算,並遞迴,以 f(0) 和 f(1) 為終止條件。標準遞迴法存在的缺點是存在大量重複的遞迴計算,例如 f(n) 和 f(n−1) 兩者向下遞迴需要各自計算 f(n - 2) 的值,時間複雜度大。
為了避免重複的遞迴計算,在標準遞迴法的基礎上,新建乙個長度為 n 的陣列,用於在遞迴時儲存 f(0) 至 f(n) 的數字值,當遇到某重複數字時可以直接從陣列取用,不妨稱之為記憶化遞迴法。但是該方法需要使用 o(n) 的額外空間,而且和標準遞迴法一樣在提交時會超出時間限制。
思路2:動態規劃
以斐波那契數列的定義為轉移方程。
思路1:遞迴
class solution:
def fib(self, n: int) -> int:
# 標準遞迴法(超出時間限制)
#if n==0: return 0
#if n==1: return 1
#return (self.fib(n-1)+self.fib(n-2))%1000000007
# 記憶化遞迴法(超出時間限制)
#cache = [-1 for i in range(n+1)]
#if n == 0:return 0
#if n == 1:return 1
#if cache[n] == -1:
#cache[n] = self.fib(n-1) +self.fib(n-2)
#return cache[n]
若使用lru_cache( )
裝飾器,可成功通過。
from functools import lru_cache
class
solution
: @lru_cache(
none
)def
fib(self, n:
int)
->
int:
if n ==0:
return
0if n ==1:
return
1return
(self.fib(n -1)
+ self.fib(n -2)
)%1000000007
思路2:動態規劃
class
solution
:def
fib(self, n:
int)
->
int:
a, b =0,
1for _ in
range
(n):
a, b = b, a + b
return a %
1000000007
斐波那契數列10
大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 斐波那契數列屬於經典的遞迴問題,對於這題的求解,我們首先要知道斐波那契數列的狀態轉移式,即f n f n 1 f n 2 且在n 1或2時,f n 1。public static int feibol...
10 斐波那契數列
效率對比 遞迴與非遞迴。差距很大。include using namespace std long long fibonacci unsigned int n if n 1 return fibonacci n 1 fibonacci n 2 long long fibonacci2 unsigne...
10 斐波那契數列
寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 1000000007 如計算初...