我试图找到1000以下3或5的倍数的所有数字。在我得到所有数字之后,我想将它们加起来。
我能够弄清楚如何找到倍数并将它们添加到数组中,但无法弄清楚如何将它们添加到一起。
这是我的代码:
var add = [];
var count = 0;
if ( i % 3 == 0 || i %5 == 0) {
for (var i = 1; i <= 1000; i ++) {
add.push(i);
}
};
function whole () {
for(var i = 0 ; i <= add.length; i ++) {
count = count + add[i];
}
};
whole();
答案 0 :(得分:2)
第一个循环不会发生,因为此时i
为undefined
(i%3为NaN)。
我认为您只需要将for
转换为if
。
for (var i = 1; i <= 1000; i ++) {
if ( i % 3 == 0 || i %5 == 0) {
add.push(i);
}
};
您需要返回count
的断言是不正确的。该功能只是作用于全球count
。
一种更干净,功能更纯粹的方法:
function whole(i, count, max){
if(i > max){
return count;
}
if(i % 3 === 0 || i % 5 === 0){
return whole(i + 1, count + i, max);
}
return whole(i + 1, count, max);
}
whole(0, 0, 1000);
答案 1 :(得分:1)
你需要把条件放在循环中,让循环运行到i < 1000
,因为你只想要数字低于1000。
for (var i = 1; i < 1000; i ++) {
if (i % 3 == 0 || i %5 == 0) {
add.push(i);
}
}
在整个函数中,您需要运行ntil i < add.length
,否则您将尝试在总和中添加未定义的索引。
function whole () {
for(var i = 0 ; i < add.length; i ++) {
count = count + add[i];
}
};
答案 2 :(得分:0)
这是对数字数组求和的更好方法。
您可以在阵列上使用reduce功能获得“减少”值
add.reduce(function(x,y) { return x+y; }, 0);
例如((0 + 1) + 2) + 3
将返回6
[1,2,3].reduce(function(x,y) { return x+y; }, 0); //=> 6
这是另一种有趣的方法,可以通过更具功能性的方法来解决问题。
它使用 ES6 ,但不要担心。您可以轻松地将示例复制/粘贴到babeljs.io/repl以查看其运行情况。 Babel也会给你相同的ES5。
// let's say we have an array of 1000 numbers
let ns = new Array(1000);
// fill the array with numbers
for (let i=0, len=ns.length; i<len; i++) {
ns[i] = i+1;
}
// some reusable functions
let mod = y => x => x % y;
let eq = y => x => x === y;
let id = x => x;
let filter = f => xs => xs.filter(f);
let reduce = f => i => xs => xs.reduce(uncurry(f), i);
let comp = g => f => x => g(f(x));
let compN = reduce(comp)(id);
let uncurry = f => (x,y) => f(x)(y);
// these are some helpers you could define using the reusable functions
let add = y => x => x + y;
let sum = reduce(add)(0);
let divisibleBy = x => comp(eq(0))(mod(x));
// define your solution as a composition
// of `sum`, `divisbleBy(5)`, and `divisibleBy(3)`
let solution = compN([
sum,
filter(divisibleBy(5)),
filter(divisibleBy(3))
]);
// output the solution passing in the original `ns` array
console.log(solution(ns));
答案 3 :(得分:0)
我认为你很亲密。在你的整个函数中,你需要返回计数。
function whole () {
for(var i = 0 ; i <= add.length; i ++) {
count = count + add[i];
}
return count;
};
答案 4 :(得分:0)
只需调用reduce而不启动参数。
arr.reduce(callback [,initialValue]):
If no initialValue was provided, then previousValue will be equal to the first value in the array and currentValue will be equal to the second.
MDN
add.reduce(function(x, y) { return x + y; });