let arr=[0,1];
let sum=0;
for(let i=2;i<4000000;i ) {
arr.push(arr[i-1] arr[i-2]);
}
for (let i=0;i<arr.length;i ) {
if (arr[i]%2==0) {
sum =arr[i];
}
}
console.log(sum);
通過考慮斐波那契數列中值不超過四百萬的項,求偶數項之和。
我對這個問題的解決方案是錯誤的,我根本不知道為什么。我不是那么有經驗,所以請如果有人能以簡單的方式解釋為什么我的代碼是錯誤的。我能做些什么來解決它?
uj5u.com熱心網友回復:
注意:我沒有 在此答案中包含代碼,因為我認為您正在做的重點是學習撰寫這些東西。(現在您已經完成了大部分作業,我確實在最后添加了一個解決方案。)
問題是您的總和很快超出了 JavaScript 的數字型別可以表示的范圍,達到了它們僅由Infinity. 數字型別只有 53 個有效有效位來保存數字。你超過了:
顯示代碼片段
let seen4M = false;
let seenInfinity = false;
let arr=[0,1];
let sum=0;
for(let i=2;i<4000000;i ) {
const num = arr[i-1] arr[i-2];
if (!seen4M && num > 4_000_000) {
console.log(`Too big: ${num}`);
seen4M = true;
} else if (!seenInfinity && !isFinite(num)) {
console.log(`Overflowed just after ${arr[i-1]}`);
seenInfinity = true;
}
arr.push(num);
}
for (let i=0;i<arr.length;i ) {
if (arr[i]%2==0) {
sum =arr[i];
}
}
console.log(sum);
您正在執行四百萬(減二)回圈,但問題要求您考慮其值小于或等于四百萬 (4M) 的斐波那契數,這是非常不同的事情,并且可以更快地達到。因此,當您的代碼確定下一個數字大于 4M 時,停止(幾乎)4M 回圈,而不是。
另請注意,沒有理由為此使用陣列,這樣做會不必要地消耗大量記憶體。相反,只需記住倒數第二個和最終值,然后在回圈中將它們洗牌。保持sum在第一個回圈而不是使用第二個回圈。
在評論中,您表明您已經使用陣列解決了它,但是不使用陣列就看不到如何解決它。以下是如何做到這一點(見評論):
顯示代碼片段
// The penultimate (second-to-last) Fibonacci number we've done
let pen = 0;
// The ultimate (last) Fibonacci number we've done
let ult = 1;
// The sum so far
let sum = 0;
// A variable for each number as we go
let num;
// Create the next number and keep looping if it's less than or
// equal to four million
while ((num = pen ult) <= 4_000_000) {
// We have a new number (`num`), count it if appropriate
if (num % 2 == 0) {
sum = num;
}
// Now that we have a new number, shuffle the last two:
// our ultimate number is our penultimate number, and
// our ultimate number is the new one
pen = ult;
ult = num;
}
console.log(sum);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/468435.html
標籤:javascript 数组 for循环
上一篇:為Swiper的幻燈片添加填充
