【问题标题】:Only last value pushed to array只有最后一个值推送到数组
【发布时间】:2016-05-26 20:59:40
【问题描述】:

我正在研究素数算法,我几乎完成了。我认为每次循环完成时都会更新输出数组,所以如果我用素数调用函数:例如primes(7),我得到[7] 而不是[2,3,5,7]。如果用非素数调用,则输出 arr 为空。

代码如下:

function rimes(num){
    var outputArr = [];

    for(var i=1; i<=num; i++){  
        function range(start, count) {
            return Array.apply(0, Array(count))
                    .map(function (element, index) { 
                             return index + start;  
                         });
        }
        var rangeArr = range(1,num);
        var current = i;

        function rangeFiltering(value){
            return value !== 1 && value < current;
        }
        var filteredRange = rangeArr.filter(rangeFiltering);

        function dividingByEachRangeElement(rangeElement){
          return current % rangeElement !== 0;
        }
        var divided = filteredRange.filter(dividingByEachRangeElement);

        if(divided.length === num - 2){  //current is prime if there are all numbers from 1 to current in divided array.(if there are zeros after modulo) i.e. when current is 5(prime), divided array is [2,3,4]. When current is 6(non prime), divided arr is [4,5] - 2,3 are missing because 6%2 = 0 and 6%3 = 0. 
            outputArr.push(current);
        }
    }
    console.log(outputArr);
}
sumPrimes(47);


//sumPrimes(6)  -> [];
//sumPrimes(7)  -> [7];
//sumPrimes(11) -> [11];

我该如何解决这个问题?

【问题讨论】:

  • 如果将 console.log(outputArr) 添加到 for 循环中,这将导致它在每个循环中输出数组。您可以看出它在最后一个循环之前不会向数组添加任何内容,所以这是您的问题。
  • 您尝试调试它吗?为什么不添加例如console.log(divided.length)divided 的定义下方,看看发生了什么?
  • 您似乎为每个i 重新计算rangeArr,每次都使用相同的参数。我认为没有必要——最好在 for 循环之前构建一次。

标签: javascript primes


【解决方案1】:

你的问题就出来了:

if(divided.length === num - 2)

这意味着仅当divided 的长度恰好等于num - 2 时,当前数字才会添加到outputArr,这仅在您的示例中icurrent 等于7 时才成立.

改成:

if(divided.length === current - 2)

应该可以解决问题。

【讨论】:

  • 哈哈,我要咖啡。。谢谢!
猜你喜欢
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2014-02-04
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多