【问题标题】:JS Classic Fibonacci Challenge - Differences between two solutionsJS 经典斐波那契挑战 - 两种解决方案之间的差异
【发布时间】: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


【解决方案1】:

我同意某些性能,解决方案 A 更好。

在许多情况下,使用 .length 会一样快,因为浏览器会预先计算它并像您自己创建一个局部变量一样高效,但是我认为在您的情况下解决方案 A 更好,因为您使用 push on循环期间的数组,因此将重新计算长度。

this 帖子的答案谈到了它,但他不像你那样有推动力。

【讨论】:

    【解决方案2】:

    @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))

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 1970-01-01
      • 2010-10-12
      • 2018-06-23
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多