Я пытаюсь лучше понять рекурсию с помощью проблемы FizzBuzz в JavaScript - PullRequest
0 голосов
/ 03 марта 2019

Я не понимаю строку 18?Если входное значение равно 100, как программа сначала печатает число 1 и заканчивается номером 100 в массиве?Любая помощь будет оценена.

function fizzBuzz(n){
  //create empty array called results
  //create base case for when n === 1
  //recurse and push value to array
  var results = [];
  if(n === 1){
    return [1];
  } else {
    if(n % 3 === 0 && n % 5 === 0){
      results.push('FizzBuzz')
    } else if (n % 3 === 0){
      results.push('Fizz')
    } else if (n % 5 === 0){
      results.push('Buzz')
    } else {
      results.push(n);
    }
      return fizzBuzz(n - 1).concat(results); // ???
    }
}

console.log(fizzBuzz(100));

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Первое, что нужно понять, это то, что каждый вызов fizzBuzz возвращает массив - он не добавляет к существующему массиву, он каждый раз создает новый.

Итак, если вход n равен 1,он просто возвращает одноэлементный массив с 1 в нем.

Если n> 1, будет рекурсивный вызов.«results» уже создан как пустой массив, поэтому операторы .push () добавляют в этот массив один элемент:

Если n делится на 3 и 5, массив будет ['FizzBuzz'] Если n делится только на 3, массив будет ['Fizz']. Если n делится только на 5, массив будет ['Buzz']. Иначе, массив будет [n] независимо от того, что n есть.

Так как n> 1 (или мы не были бы здесь), мы должны снова вызвать FizzBuzz со следующим более низким n и объединить его результат с нашим.Вот как создается длинный массив - путем конкатенации массива, возвращенного из рекурсивных вызовов в FizzBuzz.

0 голосов
/ 03 марта 2019

Сначала он создает массив results с последним значением (для 100), затем рекурсивно создает другой массив с результатами для значений от 0 до 99, а в конце объединяет их вправильный порядок.

Вы правы, это сбивает с толку.Гораздо лучшая рекурсивная реализация будет

function fizzBuzz(n) {
  if (n <= 0) {
    return [];
  }
  var results = fizzBuzz(n - 1);
  if (n % 3 === 0 && n % 5 === 0) {
    results.push('FizzBuzz');
  } else if (n % 3 === 0) {
    results.push('Fizz')
  } else if (n % 5 === 0) {
    results.push('Buzz')
  } else {
    results.push(n);
  }
  return results;
}

console.log(fizzBuzz(100));
0 голосов
/ 03 марта 2019

Эта строка

fizzBuzz(n - 1).concat(results);

может быть интерпретирована как «добавить результаты, которые мы только что собрали для n, к результатам, которые мы сгенерировали для f(n - 1)».«Добавить a к b» означает «поставить a после b».Подумайте, что это будет делать для n == 2, а затем вообще.

...