【问题标题】:Fibonacci Numbers - Add odd numbers only - Javascript斐波那契数 - 仅添加奇数 - Javascript
【发布时间】:2015-07-13 16:18:03
【问题描述】:

所以我正在尝试开发一个公式,将所有奇数斐波那契数相加,直到并包括给定的数字。

例如:

  • 给定数字是 4。那么结果应该是 5(奇数斐波那契数是 1、1、3)。

目前这是我的代码:

function sumFibs(num) {
  var sum = 0;
  for(i=0,j=1,k=0; k<=num;i=j,j=x,k++) {
    x = i + j;
    if (x%2 !== 0) {
      sum +=x;
      if (sum >= sum) {
        break;
      }
    }
  }
  return sum;
}
sumFibs(4);

显然代码不起作用。如果我删除 (if sum >= sum) break 语句,它会创建一个无限循环。我从这里的另一篇文章中获取了 for 循环,其中给出了一个公式来创建一个斐波那契数列,但是我在生成该数字后遇到了困难,我该如何添加它。我尝试这样做的方法是检查模数是否不为 0(表示它是奇数)。

感谢您的帮助。

【问题讨论】:

  • if (sum &gt;= sum) {总是评估为真,那条线试图做什么?
  • 哦等等,应该是sum &gt;= num - 现在那个会更有意义
  • 删除 ifbreak does not create 无限循环
  • for(i=0,j=1,k=0; 更改为for(var i=0,j=1,k=0; 否则它将伸出并修改i,j,k 的全局值。 (也var x = i + j;
  • 使用正常的方法计算斐波那契数列,直到你想要的数字。然后把所有的奇数加起来。如果所需的数字很大,可能会占用一些空间。

标签: javascript math sum fibonacci


【解决方案1】:

您的代码与变量名称和声明有点混淆(总是尝试使用 var 声明)。 这是一个可以满足您需要的功能

function sumFibs(num) {
  var fib0 = 0;
  var fib1 = 1;
  var fib = 1;
  var sum = fib0;
  while ( fib <= num){
    if (fib % 2) {
        sum += fib1;
    }
    fib = fib0 + fib1;
    fib1 += fib0;
    fib0 = fib1 - fib0;
  }

  return sum;
}

【讨论】:

    【解决方案2】:

    代码有些混乱...(k 是什么意思?,问题定义中元素的数量无关紧要,问题还涉及将斐波那契数求和到某个值,而不是当sum 超过某个值)。

    解决办法是

    var prev_fib = 0, cur_fib = 1;
    var sum = 0;
    while(cur_fib <= num) {
        if (cur_fib % 2 !== 0) {
            sum += cur_fib;
        }
    
        // Move on to next Fibonacci number
        var next_fib = cur_fib + prev_fib;
        prev_fib = cur_fib;
        cur_fib = next_fib;
    }
    

    选择更长的变量名会有所帮助

    【讨论】:

      【解决方案3】:

      做到这一点的最小方法。

      http://jsfiddle.net/PuneetChawla/gzr68ccv/

      function sum()
      {
          var a = 1;
          var b = 0;
          var c = 0;   
          var d = 4;       
          var temp = 1;
      
          while(c<d-1)
          {
              c = a+b;
              if(c%2 !=0){
              temp = temp+c;
              }
              b=a;
              a=c;
          }
          alert(temp);
      }
      

      【讨论】:

        【解决方案4】:

        我有一个与列出的其他一些解决方案接近的解决方案,但我发现我的解决方案更具可读性,所以在这里:

        function sumOddFibs(num) {
          var sum = 2;
        
          var prev = 1;
          var curr = 1;
          var next = 2;
        
          while (next <= num) {
            prev = curr;
            curr = next;
            next = prev + curr;
        
            if (curr % 2 !== 0) {
              sum += curr;
            }
          }
          return sum;
        }
        

        【讨论】:

          【解决方案5】:

          这是我的解决方案。

          function sumFibs(num) {
          
            var a = 0, b = 1, f = 1, sum = 0;
            var arr = [0, 1];
          
            while (f <= num) {
              if (f % 2 == 1)
                sum += f;
              arr.push(f);
              f = a + b;
              a = b; 
              b = f;       
            }
          
            console.log(arr);
            return sum;
          }
          

          【讨论】:

            【解决方案6】:

            我调整了 Neong 的反应。它可能不像其他人那么优雅,但它确实有效。最好的

            function sumFibs(num) {
            
               var a = 0, b = 1, f = 1, sum = 0;
               var arr = [0];
            
               while (f <= num) {
                 arr.push(f);
                 f = a + b;
                 a = b; 
                 b = f;       
                 }
            
               var OddOnly = arr.filter(function(value, index, array){
                   return value%2 == 1;
               });
            
               var sumArr = oddOnly.reduce(function(a,b){
                   return(a+b);
               })};
            
               return sumArr;
            
               }
            

            【讨论】:

              【解决方案7】:
              function sumFibs(num) {
              
                if(num === 1)
                  return 1;
              
                var fib = [];
                fib[0] =1;
                fib[1]=1;
                for(var i=2; i<=num;i++){
                  fib[i]=fib[i-2]+fib[i-1];
                }
              
                fib = fib.filter(function(val){
                  return (val % 2 !== 0) && (val<=num);
                });
              
                fib = fib.reduce(function(a,b){
                  return a+b;
                });
              
                return fib;
              }
              
              sumFibs(4);
              

              【讨论】:

                【解决方案8】:
                function sumOddFibonacciNumbers(num) {
                    //initialize an array with the first two numbers
                
                      let fib= [1,1]
                
                    //for-loop to push numbers according to the Fibonacci sequence 
                    // up to and including the num
                
                      for (let i = 0; i <= num; i++){
                
                        if (fib[i]+fib[i+1] <= num ) {
                            fib.push(fib[i] + fib[i+1])
                        }
                    }
                   
                    // filter the odd numbers and then reduce to get the sum
                    return fib.filter(a => a % 2 !==0).reduce((a,b) => a+b)
                }
                

                【讨论】:

                • 虽然这段代码可能会解决问题,但一个好的答案应该解释代码的什么以及它如何提供帮助。
                猜你喜欢
                • 2014-05-19
                • 1970-01-01
                • 1970-01-01
                • 2020-01-18
                • 2019-12-19
                • 1970-01-01
                • 2015-06-05
                • 2014-05-23
                • 2014-05-03
                相关资源
                最近更新 更多