dojo 初学者挑战:将所有偶数1-1000相加,是我的基本原理错了,还是只是我的代码错了?

y53ybaqx  于 2022-12-16  发布在  Dojo
关注(0)|答案(4)|浏览(165)

前几天我刚开始写代码,我正在学习coding dojo的免费初学者算法课程,我在预测输出的入门课上没有遇到任何问题,但是现在我正在写代码,我的想法似乎不能很好地翻译。
我们的任务是写一个函数来计算从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操作符后面的分号会改变答案呢?我仍然不知道分号使用的严格规则。
编辑:谢谢大家,这是一个多么棒的社区!

monwx1rj

monwx1rj1#

您的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语句后的一条语句。如果放置分号,则执行空语句。

pengsaosao

pengsaosao2#

实际上,您没有必要运行这个循环,因为这个函数总是返回相同的数字。

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

wsxa1bj13#

完全不需要循环。使用一个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
nzkunb0c

nzkunb0c4#

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

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

字符串
而你应该做的是

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

这里,a += ba = a + b的缩写,并且,<=1000在和中也包括1000。
至于你的第二个问题,if语句后面的分号使if语句无效,就像if语句后面没有{}一样,它只执行语句上的条件,直到遇到它的第一个分号。
如果在if语句中要执行的代码超过1行,可以这样实现:

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

相关问题