奇数的总和,直到Javascript达到极限

时间:2018-05-17 10:27:03

标签: javascript loops for-loop

当我在解决一个问题时说"添加从1到20"的奇数,我编码了这个:

var i, sum=0;
for (i=2; i<=20; i*2){
  sum=sum+i;
}
document.write(sum);

当我通过浏览器启动它时,它无效。但是,当我将i*2修改为i+=2时,它就有效了。

我错过了什么?我是否无法在For循环中使用*(乘数)?

5 个答案:

答案 0 :(得分:3)

问题是您没有更新for iloop的值。

  

我想添加1到20之间的奇数

然后,您需要将i的初始值更改为1

var i, sum = 0;
for (i = 1; i <= 20; i += 2){
  sum += i;
}
document.write(sum);

此外,您可以使用公式找到odd numbers from 1 to 20的总和。

n = 20;
console.log(n % 2 == 0 ? (n * n)/ 4 : ((n + 1) * (n + 1))/4);

答案 1 :(得分:2)

你可以根据你所写的关于总和的方式进行模拟。

您使用的是i += 2而不是i + 2

只需将i * 2更改为i *= 2即可。

以下是一个工作示例

var i, sum = 0;
for (i = 2; i <= 20; i *= 2) {
  console.log(i);
  sum += i;
}
document.write(sum);

但这里有几件事。

首先你写了

  

添加1到20的奇数

在你所有的例子中,你都使用偶数和。

其次,乘以你将无法达到预期目标(正如您在控制台上方的代码段中所见)

所以实际上

  

添加1到20的奇数

你应该这样做:

var i, sum = 0;
for (i = 1; i <= 20; i += 2) {
  console.log(i);
  sum += i;
}
document.write(sum);

修改

如果您想添加偶数,您仍然无法使用乘法。

为什么?只是因为你说自己想要一个数字的总和。

所以我们假设我们从2开始 如果我们将它乘以2,则其值为4,这很好 但现在看看下一次迭代会发生什么。值为4的变量i乘以2,现在它的新值为8.那么6呢? 下一次迭代将8乘以2,其新值为16.

你知道这是怎么回事吗?

当您使用i += 2代替i *= 2

因此,如果我们从2开始,而我们加2则其新值为4 在下一次迭代中,我们添加2到4,我们有6.
等等。

如果你想测试它,这里是一个乘法和添加的例子。

注意控制台日志

var i;

console.log("Multiplying");
for (i = 2; i <= 20; i *= 2) {
  console.log("i value is: " + i);
}

console.log("Adding");
for (i = 2; i <= 20; i += 2) {
  console.log("i value is: " + i);
}

答案 2 :(得分:2)

如果您需要添加1到20之间的奇数,那么您需要i+=2作为for的第三个参数,并且需要将变量初始化为1以获得正确的结果:

var sum = 0;
for (var i = 1; i <= 20; i += 2) {
    sum += i;
}

当你有

  

i + = 2

2已添加到i,结果将存储到i。当你尝试

var i, sum=0;
for (i=2; i<=20; i*2){
  sum=sum+i;
}

i*2计算的值是i的两倍,但它不会更改i的值,因此这将会#34;工作&#34;代替:

var i, sum=0;
for (i=2; i<=20; i*=2){
  sum=sum+i;
}

,其中

i *= 2

不仅计算两倍于i的值,还将结果存储到i中。但是,即使这会运行,结果也不正确,因为您使用了错误的公式。

此外,您可以在不使用for的情况下计算结果:

  

1 + 2 + ... + n = n *(n + 1)/ 2

假设n是对:并且因为我们知道我们是&#34;缺少&#34;一半的数字和所有的对数都比前面的损伤数更大,我们可以减去一半的序列

  

n *(n + 1)/ 2 - n / 2 =(n *(n + 1) - n)/ 2 =(n *(n + 1 - 1))/   2 = n * n / 2

现在我们确切地知道了我们需要的双重值,所以最终的公式是:

sum = n * n / 4;

让我们将其设为function

function getOddSumUpTo(limit) {
    if (limit % 2) limit ++;
    return limit * limit / 4;
}

然后:

var sum = getOddSumUpTo(20);

请注意,如果它是奇数,我们会增加限制。

答案 3 :(得分:0)

你可以在循环头中使用任何表达式,即使这是一个有效的for循环语句for (;;),它只是永远运行(相当于while(true))。

问题是您没有更新i中的for (i=2; i<=20; i*2)计数器,因此i在整个循环执行期间保持不变。 如果您将其更改为(i=2; i<=20; i = i*2)for (i=2; i<=20; i *=2),则可以使用。

就像你做的一样

&#13;
&#13;
let i = 1;

i * 2;
console.log(i);

i = i * 2;
console.log(i);
&#13;
&#13;
&#13;

第一个i * 2不会更新i,而第二个// wrong let i = 1; while(i <= 20) { i * 2; // do something } // right let i = 1; while(i <= 20) { i = i * 2 // or i *= 2 // do something } 会更新。{/ p>

您还可以将for循环转换为while循环,以更清楚地查看错误。

function *generateOdd(start, end) {
  for (let i = start; i <= end; i++) {
    if (i % 2 === 1) { yield i; }
  }
}

function *generateEven(start, end) {
  for (let i = start; i <= end; i++) {
    if (i % 2 === 0) { yield i; }
  }
}

function sumNums(gen, start, end) {
  const generator = gen(start, end);
  let res = 0;

  let item = generator.next();
  while (!item.done) {
    res += item.value;
    item = generator.next();
  }

  return res;
}

console.log(sumNums(generateOdd, 0, 20));
console.log(sumNums(generateEven, 0, 20));

只是旁注,如果你想有效地对更多类型的序列进行求和,你可以使用基于生成器的方法并编写求和函数并用生成函数描述每种类型的序列。

&#13;
&#13;
env->CallObjectMethod( mediaPlayer.GetRawObject(), setSurfaceMethodId, parms);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

你在寻找的是:

&#13;
&#13;
let sum = 0;
for(var i = 2; i <= 20; i += 2){
  sum += i;
}
document.write(sum)
&#13;
&#13;
&#13;

另一种观点:

&#13;
&#13;
// set to n (what you want). Set to n + 1
var N = 21;

// The main driver code create an array from 0-(N-1) and removes all even nums

let a = Array.apply(null, {length: N}).map(Number.call, _ => +_).filter(_=>_%2)

// console.log the array
console.log(a)
&#13;
&#13;
&#13;