这里的代码确实有效,但我不太明白为什么。
如果我删除内部返回语句并只保留末尾的语句,它将返回正确的console.log(evenFibonnacisSum(100))
和 (44(,但未定义console.log(evenFibonnacisSum(4000000))
.
如果我删除外部返回语句并将该语句保留在 if 语句中,它将返回未定义console.log(evenFibonnacisSum(100))
但console.log(evenFibonnacisSum(4000000))
返回正确的总和(46000000 左右(。
function evenFibonnacisSum(upperlimit){
let evenSum = 0
let seq = [0, 1]
for(i=0; i<=upperlimit; i++) {
if(evenSum<upperlimit) {
let next = seq[i]+seq[i+1];
seq.push(next)
if(seq[i]%2 === 0 && seq[i]<upperlimit) {
evenSum += seq[i]
}
} else {
return evenSum
}
}
return evenSum
}
console.log(evenFibonnacisSum(100))
console.log(evenFibonnacisSum(4000000))
这不是一个大问题,但它真的很不直观。 任何人都知道为什么会这样?
如果你删除内部回车并传入一个大upperlimit
,那么它将尝试执行循环的次数太多。 您的环境意识到它花费的时间太长并中止了该功能。
如果您删除外部退货,那么100
您永远不会击中内部退货,因为正确答案evenSum < upperlimit
.
我建议这样编码:
function evenFibonnacisSum(upperlimit){
let evenSum = 0
let seq = [0, 1]
i = 0
while(seq[i] < upperlimit) {
let next = seq[i]+seq[i+1];
seq.push(next)
if(seq[i]%2 === 0) {
evenSum += seq[i]
}
i++
}
return evenSum
}