首页 > 解决方案 > 为什么我返回未定义的大数而不是小数?(斐波那契数列和)

问题描述

此处的代码确实有效,但我不太明白为什么。

如果我删除内部 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))

这不是一个大问题,但它真的很不直观。任何人都知道为什么会这样?

标签: javascriptalgorithmfibonacci

解决方案


如果您删除内部 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
}

推荐阅读