javascript - 为什么我返回未定义的大数而不是小数?(斐波那契数列和)
问题描述
此处的代码确实有效,但我不太明白为什么。
如果我删除内部 return 语句并只保留最后一个,它将返回正确的总和 (44) for console.log(evenFibonnacisSum(100))
,但 undefined for console.log(evenFibonnacisSum(4000000))
。
如果我删除外部返回语句并将其保留在 if 语句中,它将返回未定义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))
这不是一个大问题,但它真的很不直观。任何人都知道为什么会这样?
解决方案
如果您删除内部 return 并传入一个 large 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
}
推荐阅读
- c++11 - 在 C++ 11 中的函数声明之后,'->' 是什么意思?
- codeigniter - Codeigniter 使用 url 切换语言
- server - 未启用fail2ban监狱
- angularjs - 使用angularjs将剑道网格的所有列导出为pdf
- r - 仅使用月份和年份更改日期格式
- android - 如何在 android studio 上导入 espresso withID?
- mysql - 通过 PHP 将 MySQL 数据发送到 Google BigQuery
- python - 索引中的错误日期与我没有要求的第二张图
- linux - 关于 DS 记录更新的 DNSSEC 密钥翻转
- javascript - 用于在两个数组中查找公共元素的 Javascript 程序