Почему я возвращаю undefined для большого числа, а не для маленького? (Сумма последовательности Фибоначчи) - PullRequest
2 голосов
/ 26 мая 2020

этот код работает, но я не совсем понимаю, почему.

если я удалю внутренний оператор return и оставлю только тот, который находится в конце, он вернет правильную сумму (44) для console.log(evenFibonnacisSum(100)), но не определено для console.log(evenFibonnacisSum(4000000)).

, если я удалю внешний оператор return и сохраню его внутри оператора if, он вернет undefined для 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))

это не большая проблема, но это действительно не интуитивно понятно. Кто-нибудь знает, почему это может быть?

1 Ответ

3 голосов
/ 26 мая 2020

Если вы удалите внутренний возврат и передадите большой upperlimit, то он будет пытаться выполнить l oop слишком много раз. Ваша среда понимает, что это занимает слишком много времени, и прерывает выполнение функции.

Если вы удалите внешний возврат, тогда для 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
}
...