初学者挑战:将所有偶数 1-1000 相加.是我的理由错了还是只是我的代码

Beginner Challenge: Sum all even numbers 1-1000. Is my rationale wrong or just my code?

本文关键字:我的 理由 错了 代码 相加 1-1000 挑战 初学者      更新时间:2023-09-26

前几天我刚开始编码,我正在学习编码道场的免费初学者算法课程。我在预测输出的入门课程中没有遇到任何问题,但现在我正在编写代码,我的想法似乎不能很好地翻译。

任务是编写一个函数,该函数将获取从 1 到 1000 的所有偶数的总和。他们提到我可以使用模运算符,但我认为该运算符有点做作。相反,我认为运行 For 循环更容易、更高效,从 0 开始,每个循环添加 2。每次循环后,新数字将被添加到前一个数字中,这将是当前的 sum 变量。我已经附上了我尝试的解决方案:

function sum_even_numbers(){
    var sum = 0;
    for(var x=2; x!=1000; x+2)
    {
      sum+=x;
    }
    return sum; 
}

不幸的是,这只会冻结我的浏览器,直到我停止脚本(我想它处于无限循环中)。前面的大部分课程工作都涉及使用 console.log() 的输出,我什至不确定为什么我不能使用它而不是返回运算符。可以告诉我解决问题的方法是否有效,如果是,代码有什么问题。如果不是,我的逻辑有缺陷。我在下面包含了建议的解决方案。

function sum_even_numbers(){
    var sum = 0;
    for(var x = 1; x < 1001; x++){
      if(x % 2 === 0){
      sum += x;
      }
    }
    return sum; 
}

谢谢大家

另外,如果您有时间,为什么 If 运算符后面的分号会改变答案这么多?我仍然不知道分号使用的硬规则。

编辑:谢谢大家,多么棒的社区!

你的 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 语句后面执行一条语句。当您放置分号时,您将执行一个空语句。

真的,没有理由实际上必须运行循环,因为此函数始终返回相同的数字。

function get_the_sum()
{
    //Sum of even numbers <= 1000
    //=(1000+0 + 998+2 + 996+4 ... + 0+1000) / 2
    return 500*501;
}

根本不需要循环。使用 O(1) 函数对从 1 到 N 的范围求和,您也可以轻松推导出偶数和奇数和:

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

您必须确保正确增加循环。除此之外,你的推理似乎是完全正确的。
您正在执行:

for(x=0;x!=1000;x+2)

而你应该做这样的事情:

for(x=0;x<=1000;x+=2) 

在这里,a += ba = a + b的快捷方式。此外,<=1000还包括 1000 的总和。

至于你的第二个问题,if 语句后面的分号会使 if 语句无效,就好像 if 语句后没有放置{}一样,它只执行语句上的条件,直到遇到第一个分号。
如果你有超过 1 行代码要在 if 语句中执行,你可以像这样实现它:

if(condition) {
    code line 1;
    code line 2;
    code line 3;
}