JZ10 I 斐波那契數列

2021-10-09 15:56:32 字數 2170 閱讀 4889

[原題鏈結]寫乙個函式,輸入 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 如計算初...