繁体   English   中英

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

[英]Sum of odd numbers until reached limit in Javascript

当我在解决一个问题“添加从1到20的奇数”时,我对此进行了编码:

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

当我通过浏览器启动它时,它无法正常工作。 但是,当我将i*2修复为i+=2 ,它起作用了。

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

问题是你没有在for loop更新i的值。

我想添加从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 20odd numbers from 1 to 20之和。

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

你可以根据你所写的关于总和的方法来做它。

你用的是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); } 

如果你需要添加从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的值,所以这将“起作用”:

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是对:并且因为我们知道我们“丢失”了一半数字并且所有对数都比前面的损伤数更准确地加1,我们可以减去一半的序列

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);

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

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

问题是你没有更新i计数器for (i=2; i<=20; i*2)所以i在整个循环执行期间保持不变。 如果你把它改为for (i=2; i<=20; i = i*2)或者for (i=2; i<=20; i *=2)那么它就可以了。

就像你做的一样

 let i = 1; i * 2; console.log(i); i = i * 2; console.log(i); 

第一个i * 2不更新i而第二个i更新。

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

// 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
}

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

 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)); 

你在看什么是这样的:

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

另一个看法:

 // 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) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM