应该将所有低于1000的自然数加起来,这些自然数是3或5的倍数。
var sum = _.reduce( _.range(1, 1000), function(x, n) {
if (n % 3 == 0 || n % 5 == 0) { return x+=n; }
}, 0);我希望输出是233168,但我得到了NaN。
由于某些原因,sum不接受0的初始化值。但是,如果我用var sum = 0;作为前缀,那么它可以工作,并返回233168的适当输出。
为什么它不接受初始化的值?
发布于 2015-09-12 19:33:19
问题是,当条件失败时,约简函数返回undefined。因此,x的计算结果是后续调用中未定义的(最后一个返回值)。未定义的+一个数字是..。好吧,NaN。
而且,reduce被错误地使用;它应该携带自己的状态。将其与以下方面进行比较:
var sum = _.reduce( _.range(1, 1000), function(x, n) {
// Add n to the tally if it is a valid multiple..
// (the returned value is used as the *next* value of x)
if (n % 3 == 0 || n % 5 == 0) { return x + n; }
// ..or simply return the current tally.
else { return x; }
}, 0);请注意,sum变量不是从减值函数中赋值的(它无论如何都会被外部赋值覆盖)。这使reduce保持了一个纯粹的操作,而不是忍受偶尔被滥用的可变备忘录,更符合它的功能根。
https://stackoverflow.com/questions/32542850
复制相似问题