新手挑战:将 1-1000 的所有偶数相加。我的理由是错误的还是只是我的代码?
Beginner Challenge: Sum all even numbers 1-1000. Is my rationale wrong or just my code?
前几天我刚开始编码,正在学习编码道场的免费初学者算法课程。我在入门课程预测输出方面没有遇到任何问题,但现在我正在编写代码,我的想法似乎无法很好地转化。
任务是编写一个函数,获取 1 到 1000 之间所有偶数的总和。他们提到我可以使用取模运算符,但我认为该运算符有点做作。相反,我认为 运行 一个 For 循环更容易和更有效,从 0 开始并在每个循环中添加 2。在每个循环之后,新数字将添加到前一个数字中,这将是当前的总和变量。我已附上我尝试的解决方案:
function sum_even_numbers(){
var sum = 0;
for(var x=2; x!=1000; x+2)
{
sum+=x;
}
return sum;
}
不幸的是,这只会冻结我的浏览器,直到我停止脚本(我猜它处于无限循环中)。之前的大部分课程工作都涉及使用 console.log() 的输出,我什至不确定为什么我不能使用它而不是 return 运算符。可以告诉我解决问题的方法是否有效,如果有效,代码有什么问题。如果不是,那么我的逻辑中存在缺陷。我在下面包含了建议的解决方案。
function sum_even_numbers(){
var sum = 0;
for(var x = 1; x < 1001; x++){
if(x % 2 === 0){
sum += x;
}
}
return sum;
}
谢谢大家
还有,如果你有时间,为什么 If 运算符后的分号会改变这么多答案?我仍然不知道分号使用的硬性规则。
编辑:谢谢你们,多么棒的社区!
您必须确保正确增加循环。除此之外,您的推理似乎完全正确。
您正在做:
for(x=0;x!=1000;x+2)
而你应该这样做:
for(x=0;x<=1000;x+=2)
这里,a += b
是a = a + b
的快捷方式。此外,<=1000
的总和也包括 1000。
关于你的第二个问题,if语句后的分号使if语句无效,就好像没有{}
放在if语句后面一样,它只执行语句的条件,直到遇到第一个分号.
如果在 if 语句中要执行的代码多于 1 行,则可以这样实现:
if(condition) {
code line 1;
code line 2;
code line 3;
}
你的 for 循环不正确。
你有
for(var x=2; x!=1000; x+2)
你应该做什么
for(var x=2; x<=1000; x = x+2)
目前,您的循环从不更新 x,因此它始终具有相同的值。 for 循环中的语句 3 按原样执行,因此您的代码只执行 x+2,这只是一些数字。我上面建议的代码将 x 更新为等于 x+2。
一旦 x 等于 1000,您的条件就会终止循环,因此不会将 1000 添加到总和中。您需要在 x 等于 1002 或更好地使用
时打破循环
x<=1000
在 if 条件后加一个分号意味着如果满足该条件则什么都不做。如果你不在 if 后面放一个“{”,那么当你的条件满足时,只会执行 if 语句后面的一个语句。当你放一个分号时,你就执行了一条空语句。
真的,你实际上没有理由 运行 循环,因为这个函数总是 returns 相同的数字。
function get_the_sum()
{
//Sum of even numbers <= 1000
//=(1000+0 + 998+2 + 996+4 ... + 0+1000) / 2
return 500*501;
}
完全不需要循环。使用对 1 到 N 范围求和的 O(1) 函数,您也可以轻松导出偶数和奇数和:
function Adjust(n) {
return n % 2 === 0 ? n : --n;
}
function SumRange(n, m) {
if (n > m)
return 0;
var sum = (m * ++m) >> 1;
return n > 1 ? sum - SumRange(0, --n) : sum;
}
function SumRangeEven(n, m) {
var sum = SumRange(Adjust(n), m >> 1);
return sum + sum;
}
function SumRangeOdd(n, m) {
return SumRange(n, m) - SumRangeEven(n, m);
}
console.log(SumRange(0,101)) //5151
console.log(SumRangeEven(0,101)) //2550
console.log(SumRangeOdd(0,101)) //2601
console.log(SumRangeEven(0,101) + SumRangeOdd(0,101)) //5151
前几天我刚开始编码,正在学习编码道场的免费初学者算法课程。我在入门课程预测输出方面没有遇到任何问题,但现在我正在编写代码,我的想法似乎无法很好地转化。
任务是编写一个函数,获取 1 到 1000 之间所有偶数的总和。他们提到我可以使用取模运算符,但我认为该运算符有点做作。相反,我认为 运行 一个 For 循环更容易和更有效,从 0 开始并在每个循环中添加 2。在每个循环之后,新数字将添加到前一个数字中,这将是当前的总和变量。我已附上我尝试的解决方案:
function sum_even_numbers(){
var sum = 0;
for(var x=2; x!=1000; x+2)
{
sum+=x;
}
return sum;
}
不幸的是,这只会冻结我的浏览器,直到我停止脚本(我猜它处于无限循环中)。之前的大部分课程工作都涉及使用 console.log() 的输出,我什至不确定为什么我不能使用它而不是 return 运算符。可以告诉我解决问题的方法是否有效,如果有效,代码有什么问题。如果不是,那么我的逻辑中存在缺陷。我在下面包含了建议的解决方案。
function sum_even_numbers(){
var sum = 0;
for(var x = 1; x < 1001; x++){
if(x % 2 === 0){
sum += x;
}
}
return sum;
}
谢谢大家
还有,如果你有时间,为什么 If 运算符后的分号会改变这么多答案?我仍然不知道分号使用的硬性规则。
编辑:谢谢你们,多么棒的社区!
您必须确保正确增加循环。除此之外,您的推理似乎完全正确。
您正在做:
for(x=0;x!=1000;x+2)
而你应该这样做:
for(x=0;x<=1000;x+=2)
这里,a += b
是a = a + b
的快捷方式。此外,<=1000
的总和也包括 1000。
关于你的第二个问题,if语句后的分号使if语句无效,就好像没有{}
放在if语句后面一样,它只执行语句的条件,直到遇到第一个分号.
如果在 if 语句中要执行的代码多于 1 行,则可以这样实现:
if(condition) {
code line 1;
code line 2;
code line 3;
}
你的 for 循环不正确。 你有
for(var x=2; x!=1000; x+2)
你应该做什么
for(var x=2; x<=1000; x = x+2)
目前,您的循环从不更新 x,因此它始终具有相同的值。 for 循环中的语句 3 按原样执行,因此您的代码只执行 x+2,这只是一些数字。我上面建议的代码将 x 更新为等于 x+2。
一旦 x 等于 1000,您的条件就会终止循环,因此不会将 1000 添加到总和中。您需要在 x 等于 1002 或更好地使用
时打破循环x<=1000
在 if 条件后加一个分号意味着如果满足该条件则什么都不做。如果你不在 if 后面放一个“{”,那么当你的条件满足时,只会执行 if 语句后面的一个语句。当你放一个分号时,你就执行了一条空语句。
真的,你实际上没有理由 运行 循环,因为这个函数总是 returns 相同的数字。
function get_the_sum()
{
//Sum of even numbers <= 1000
//=(1000+0 + 998+2 + 996+4 ... + 0+1000) / 2
return 500*501;
}
完全不需要循环。使用对 1 到 N 范围求和的 O(1) 函数,您也可以轻松导出偶数和奇数和:
function Adjust(n) {
return n % 2 === 0 ? n : --n;
}
function SumRange(n, m) {
if (n > m)
return 0;
var sum = (m * ++m) >> 1;
return n > 1 ? sum - SumRange(0, --n) : sum;
}
function SumRangeEven(n, m) {
var sum = SumRange(Adjust(n), m >> 1);
return sum + sum;
}
function SumRangeOdd(n, m) {
return SumRange(n, m) - SumRangeEven(n, m);
}
console.log(SumRange(0,101)) //5151
console.log(SumRangeEven(0,101)) //2550
console.log(SumRangeOdd(0,101)) //2601
console.log(SumRangeEven(0,101) + SumRangeOdd(0,101)) //5151