答案:寫乙個函式,輸入 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
看到斐波那契數列我們最先想到的是用遞迴的方式,例如下面**就是利用遞迴的方式實現的:
public
intfib
(int n)
else
;
其實面試遇到這種題最好不要在面試官面前用遞迴的方式來解題,這估計會掉入面試官挖的坑。這種做法空間時間都很不理想,它會進行很多的重複性運算。遞迴的好處算是顯而易見了,因為符合程式語言和人類思維,所以遞迴的**寫出來都是非常簡潔的,無非就是設計好終止條件,然後根據不同的條件做遞迴就行了。在很多情況下都是非常好用的,比如在運算元據結構中的樹,比如需要使用棧的一些特性中。但是遞迴也有自己的缺點,首先就是開銷問題,因為使用遞迴要多次的呼叫函式,這是有開銷的,當問題的規模非常大的時候,過於多次的呼叫會使得程式的棧溢位,這也是務必需要規避的。此外,遞迴還有乙個缺點就是有可能帶來重複計算的問題。斐波那契數列的遞迴計算路徑如下圖所示:
我們一般要考慮使用其他方法來解題。
**如下:
class
solution
return first;}}
;執行用時:0 ms, 在所有 c++ 提交中擊敗了100.00
%的使用者
記憶體消耗:6 mb, 在所有 c++ 提交中擊敗了49.10
%的使用者
動態規劃解析: 狀態定義:設 dp為一維陣列,其中 dp[i] 的值代表 斐波那契數列第 i個數字 。 轉移方程:dp[i + 1] = dp[i] + dp[i - 1],即對應數列定義 f(n + 1) = f(n) + f(n - 1) ; 初始狀態: dp[0] = 0, dp[1] = 1,即初始化前兩個數字; 返回值: dp[n] ,即斐波那契數列的第 n 個數字。
**如下:
class
solution
};
方法二中陣列最好定義成dp[101],而不是dp[n+1];因為這可能取決編譯器版本,c++/c現在可以把陣列長度定義為變數,不過裡面的值是隨機的,不能把陣列長度定義為變數的同時進行初始化,必須在另外初始化為0。
在解題過程中對於為什麼可以邊算邊取模和最後再取模結果一樣感到困惑。不過有大佬給出了證明過程,這裡粘過來給大家參考一下。
證明: 要證(a+b)%c = (a%c+b%c)%c ,即證a+b與a%c+b%c對c同餘 ,則有c能整除(a+b-a%c-b%c) 。設a=mc+p、 b=nc+q ,則(a+b-a%c-b%c)=(m+n)c+p+q-p-q=(m+n)c ,則證a+b與a%c+b%c對c同餘,證畢。
C 斐波那契數列
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞迴的方法定義 f ...
C 斐波那契數列
斐波那契數列 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,n n 1.static int func int n i...
c 斐波那契數列
題目描述 faibonacci數列前幾項為 0,1,1,2,3,5,8,其規律是從第三項起,每項均等於前兩項之和。求前n項,並以每行5個數的格式輸出。輸入乙個正整數n 3 n 30 表示斐波那契數列的項數。輸出若干行,每行五個數,每個數使用10個位置輸出。樣例輸入 樣例輸出 0 1 1 2 3 5 ...