这里的这段代码确实能用,但我不太明白为什么。
如果我去掉内部的返回语句,只保留最后一条,它将返回正确的和(44),对于 console.log(evenFibonnacisSum(100))
但未定义的 console.log(evenFibonnacisSum(4000000))
.
如果我把外部的返回语句去掉,而把if语句里面的语句保留下来,它将返回undefined for console.log(evenFibonnacisSum(100))
但正确的总和(46000000左右)为 console.log(evenFibonnacisSum(4000000))
.
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
然后它将尝试执行循环太多次。 你的环境意识到它花费的时间太长,于是中止了这个函数。
如果你删除了外部返回,那么for 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
}