簡體   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