相信你們都不陌生,在高中數學中都有接觸過,斐波那契數列以以下被以遞推的方法定義:前端
F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
編程
百度百科 -斐波那契數列 bash
咱們平時用編程語言編寫的遞歸方法,其實就是斐波那契數列表達式,而表達式是能夠推導出通項公式的,這也是斐波那契數列在程序中最好的思想表達。編程語言
斐波那契數,一般用 F(n) 表示,造成的序列稱爲斐波那契數列。該數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是:學習
F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 給定 N,計算 F(N)。ui
方案一:最精簡經過遞歸,可是時間複雜度很高O(n^2),執行分析結果以下: spa
/**
* @param {number} N
* @return {number}
*/
var fib = function(N) {
if (N<=1) return N;
return fib(N-1) + fib(N-2);
};
複製代碼
方案二:for循環,用兩個變量保存前兩項斐波那契數便可。而且變量交換時也無需臨時變量,空間複雜度O(N)3d
/**
* @param {number} N
* @return {number}
*/
var fib = function(N) {
if (N<2) return N;
var frist = 0;
var second = 1;
for (var i=2;i<=N;i++) {
second = frist + second;
frist = second - frist;
}
return second;
};
複製代碼
方案三:這個空間複雜度與時間複雜度都僅需O(N),while循環實現code
/**
* @param {number} N
* @return {number}
*/
var fib = function(N) {
var f = first,second =1;
if (N == 0) return 0;
while(--N) {
second = second + first;
first= second-first;
}
return second;
};
複製代碼
方案四:斐波那契通項公式cdn
/**
* @param {number} N
* @return {number}
*/
var fib = function(N) {
return Math.floor((Math.sqrt(5) / 5) * ( Math.pow((1 + Math.sqrt(5)) / 2, N) - Math.pow((1 - Math.sqrt(5)) / 2, N)))
}
複製代碼
能夠複製以上代碼到leetcode-斐波那契數列進行驗證。
歡迎小夥伴評論區提出更好的解決方案,記得點贊👍鼓勵下哦!
掃一掃下面的二維碼,回覆學習便可免費領取最新前端學習資料,也但願在前端進階的路上,咱們一塊兒成長,一塊兒進步!