js如何計(jì)算斐波那契數(shù)列第n項(xiàng)的值
js計(jì)算斐波那契數(shù)列第n項(xiàng)的值
function myFibonacci(n) {
if(n < 0){return;}
if(n === 0){ return 0;}
if(n === 1){ return 1;}
if(n > 1){
return myFibonacci(n-1) + myFibonacci(n-2);
}
}js求斐波那契數(shù)列Fibonacci中的第n個(gè)數(shù)是多少?
// **3 求斐波那契數(shù)列Fibonacci中的第n個(gè)數(shù)是多少?**
// > 1 1 2 3 5 8 13 21...
// > f(n)=f(n-1)+f(n-2)
// >
// > f(1)=f(2)=1
function getFib(n) {
var n1 = 1;//儲(chǔ)存f-2
var n2 = 1;//儲(chǔ)存f-1
var n3 = 0;//儲(chǔ)存取得值
//i=2,因?yàn)榈谝粋€(gè)算的就是第三個(gè)的值
for(var i = 2; i < n; i++) {
n3 = n1 + n2;
//為取下一個(gè)值做準(zhǔn)備,原來的n-1變成n-2,當(dāng)前取出的值變成了下一個(gè)的n-1
n1 = n2;
n2 = n3;
}
return n3;js實(shí)現(xiàn)斐波那契數(shù)列求項(xiàng)及優(yōu)化
斐波那契數(shù)列
相信每一個(gè)接觸算法的人都會(huì)遇到一道經(jīng)典的算法問題,斐波那契數(shù)列。
斐波那契數(shù)列的規(guī)律也很簡單,就是第一第二項(xiàng)值為1,第三項(xiàng)開始每一項(xiàng)值為該項(xiàng)前兩項(xiàng)的和;實(shí)現(xiàn)起來也并不難。
function fib(n){
if (n===1 || n===2){//判斷項(xiàng)所在位置,如果為第一第二項(xiàng),返回1
return 1;
} else{
return fib(n-1)+fib(n-2);//位置在第三項(xiàng)及以后,返回前兩項(xiàng)和
}
}
console.log(fib(5));
這個(gè)就是在JS里面簡單實(shí)現(xiàn)求斐波那契數(shù)列某一項(xiàng)值的一個(gè)代碼;
但是這個(gè)代碼的缺陷也是很明顯的,時(shí)空復(fù)雜度太高;我們可以定義一個(gè)變量 i 來看一下
let =0;
function fib(n){
i++;
if (n===1 || n===2){//判斷項(xiàng)所在位置,如果為第一第二項(xiàng),返回1
return 1;
} else{
return fib(n-1)+fib(n-2);//位置在第三項(xiàng)及以后,返回前兩項(xiàng)和
}
}
console.log(fib(5));
console.log(i);

在這個(gè)圖片里面我們可以看到,當(dāng)n的值為40的時(shí)候,i 的值是204668309,也就是說我們求斐波那契第40項(xiàng)的時(shí)候函數(shù)被調(diào)用的次數(shù);
因?yàn)樽址牟豢勺兲卣髦灰€沒找到函數(shù)出口前就會(huì)一直在棧上開辟新空間去存儲(chǔ)數(shù)據(jù),這個(gè)也是棧溢出最主要的原因。
優(yōu)化
有問題那么我們就要去優(yōu)化,最主要的性能問題就是數(shù)據(jù)存儲(chǔ)上會(huì)不斷開辟新空間造成空間復(fù)雜度的提升,解決方法也很簡單:定義一個(gè)空數(shù)組存儲(chǔ)斐波那契數(shù)列項(xiàng)。因?yàn)閿?shù)組是一個(gè)復(fù)雜類型存儲(chǔ)在堆里面,而且需要new的時(shí)候才會(huì)去創(chuàng)建一個(gè)新的存儲(chǔ)空間,我們只需要在棧上建立一個(gè)索引去訪問該數(shù)組就可以。
//定義存儲(chǔ)斐波那契數(shù)列項(xiàng)數(shù)組
let result = [];
let i=0;
function sum(a) {
i++;
//首先判斷數(shù)組內(nèi)有沒有當(dāng)前斐波那契數(shù)列項(xiàng),如果有直接從數(shù)組獲??;沒有則將該項(xiàng)push進(jìn)數(shù)組,再從數(shù)組過去該項(xiàng)
if (result[a] !== undefined){
return result[a];
} else{
if (a===1 || a===2){
result[a] = 1;
return 1;
} else{
result[a] = sum(a-1)+sum(a-2);
return result[a];
}
}
}
console.log(sum(1476));
console.log(i);
上面代碼就是經(jīng)過優(yōu)化之后的代碼,很簡單;就是添加了一個(gè)數(shù)組存儲(chǔ)斐波那契數(shù)列項(xiàng)。效果也是很顯著;
下面是求第1476項(xiàng) i 的值:

上面就是斐波那契數(shù)列求項(xiàng)的實(shí)現(xiàn)以及優(yōu)化代碼
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
BOM系列第一篇之定時(shí)器setTimeout和setInterval
這篇文章主要介紹了BOM系列第一篇之定時(shí)器setTimeout和setInterval 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
三種動(dòng)態(tài)加載js的jquery實(shí)例代碼另附去除js方法
這篇文章主要介紹了三種動(dòng)態(tài)加載js的jquery實(shí)例代碼另附去除js方法,需要的朋友可以參考下2014-04-04
webpack+vue2構(gòu)建vue項(xiàng)目骨架的方法
本篇文章主要介紹了webpack+vue2構(gòu)建vue項(xiàng)目骨架的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
js分解url參數(shù)(面向?qū)ο?極簡主義法應(yīng)用)
剛看到笑看風(fēng)云寫的JavaScript面向?qū)ο?極簡主義法)和一個(gè)分解url參數(shù)面試題,我作了一下修改,記錄下來2012-08-08
uni-app使用Vite.config.js配置文件的超詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于uni-app使用Vite.config.js配置文件的超詳細(xì)教程,在uniapp開發(fā)中,vue.config.js是配置webpack的關(guān)鍵文件之一,也可以說是uniapp項(xiàng)目自定義配置的中心,需要的朋友可以參考下2023-12-12
javascript高級(jí)編程之函數(shù)表達(dá)式 遞歸和閉包函數(shù)
這篇文章主要介紹了javascript高級(jí)編程之函數(shù)表達(dá)式 遞歸和閉包函數(shù)的相關(guān)資料,需要的朋友可以參考下2015-11-11

