代码之家  ›  专栏  ›  技术社区  ›  claudiopb

JS经典斐波那契挑战-两种解决方案之间的差异

  •  0
  • claudiopb  · 技术社区  · 3 年前

    对于同一个挑战,我有两个解决方案,这个经典的斐波那契挑战,每个人都知道如何解决(即使是你的宠物)。

    我只想比较这两种解决方案。通过搜索可以找到数千种不同的解决方案。

    挑战:

    /*
         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 ? 因为在 我们有以下这一行:

    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))
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Eliyah Afzal    3 年前

    在许多情况下,使用.length的速度会一样快,因为浏览器会预先计算它,就像您自己生成局部变量一样高效。然而,我认为在您的情况下,解决方案a更好,因为您在循环期间使用数组上的推送,所以长度将被重新计算。

    答案 this

        2
  •  1
  •   Mister Jojo Łukasz Daniel Mastalerz    3 年前

    @Jojojo先生,你能给我一个代码示例来简化它吗?

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