對于同一個挑戰,我有兩種解決方案,這個經典的斐波那契挑戰,每個人都知道如何解決(甚至你的寵物)。
我懇請您不要提出任何其他解決方案。我只想比較這兩種解決方案。通過搜索可以找到數千種不同的解決方案。
挑戰:
/*
0 1 2 3 4 5 6 7 8 9
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
fib(3) returns 2
fib(9) returns 34
and so on...
*/
下面的兩種解決方案都運行良好。我唯一的問題是:
解決方案 B 的運行速度是否比解決方案 A慢?因為在B 中,我們有以下這一行:
fibArr.push(fibArr[fibArr.length - 1] fibArr[fibArr.length - 2])
length函式是否遍歷整個陣列來計算專案數?或者已經立即回傳?
解決方案一:
function fib(n) {
const fiboArray = [0,1]
for(let i=2; i <= n; i ) {
fiboArray.push(fiboArray[i-2] fiboArray[i-1])
}
return fiboArray[n]
}
console.log(fib(5))
解決方案B:
function fib(n) {
const fibArr = [0, 1, 1]
if(n == 0) {
return 0
}
if(n == 1 || n == 2) {
return 1
}
if (n > 2) {
for (let i = 3; i <= n; i ) {
fibArr.push(fibArr[fibArr.length - 1] fibArr[fibArr.length - 2])
}
}
return fibArr[fibArr.length - 1]
}
console.log(fib(9))
uj5u.com熱心網友回復:
我同意CertainPerformance,解決方案A 更好。
在許多情況下,使用 .length 會一樣快,因為瀏覽器會預先計算它并且像你自己創建一個區域變數一樣高效,但是我認為在你的情況下解決方案 A 更好,因為你在陣列上使用 push回圈所以長度將被重新計算。
這篇文章的答案談到了它,但他不像你那樣有推動力。
uj5u.com熱心網友回復:
@MisterJojo 你能給我看一個代碼示例來簡化它嗎?
function my_Fibonacci(n)
{
let a = 0
, b = 1
, r = [0, 1]
;
for(let i=2; i<=n; i )
{
r.push(a b) // new fibonacci value
a = b // set a for next addition
b = r[i] // set b for next addition
}
// return r.join(' - ')
return b
}
document.write(my_Fibonacci(9))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364813.html
標籤:javascript 数组 循环
