【发布时间】:2022-01-02 11:14:06
【问题描述】:
对于同一个挑战,我有两个解决方案,这个经典的斐波那契挑战,每个人都知道如何解决它(甚至是你的宠物)。
恳请您不要提出任何其他解决方案。 我只想比较这两种解决方案。通过搜索可以找到数千种不同的解决方案。
挑战:
/*
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 函数是否遍历整个数组来计算项数?还是已经立即返回?
解决方案 A:
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))
【问题讨论】:
-
是的,不每次都提取
.length可以让它不知不觉地更快,但它几乎肯定不是瓶颈 -
否则在每一轮循环中重新计算 2 个索引位置而不是简单地保留最后 2 个总和以进行下一次迭代仍然有点傻
-
@MisterJojo 你能给我看一个代码示例来简化它吗?
标签: javascript arrays loops