为什么我对一个大数返回未定义,而对一个小数不返回?(斐波那契数列和)

问题描述 投票:2回答:1

这里的这段代码确实能用,但我不太明白为什么。

如果我去掉内部的返回语句,只保留最后一条,它将返回正确的和(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))

这不是一个很大的问题,但它真的很不直观。任何人有任何见解,为什么这可能是?

javascript algorithm fibonacci
1个回答
3
投票

如果你去掉内部返回语句,并传入一个大的 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
}
© www.soinside.com 2019 - 2024. All rights reserved.