我试图通过使用javascript中的FizzBu​​zz问题更好地理解递归

时间:2019-03-03 19:03:05

标签: javascript recursion fizzbuzz

我不明白第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 :(得分:2)

它首先使用最后一个值(用于results)创建一个100数组,然后递归创建另一个数组,其值的范围为099,最后将它们按正确的顺序连接。

您是对的,这令人困惑。更好的递归实现是

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));

答案 1 :(得分:1)

首先要意识到的是,每次fizzBu​​zz调用都会返回一个数组-它不会添加到现有数组中,而是每次都会创建一个新数组。

因此,如果输入n为1,则仅返回其中包含1的单元素数组。

如果n> 1,将进行递归调用。 “结果”已经被创建为一个空数组,因此.push()语句向该数组添加了一个元素:

如果n被3和5整除,则数组为['FizzBu​​zz'] 如果n仅可被3整除,则数组将为['Fizz'] 如果n仅可被5整除,则数组将为['Buzz'] 否则,数组将是[n]等于n。

由于n> 1(否则我们就不会在这里),我们必须再次使用下一个较低的n调用FizzBu​​zz,并将其结果连接到我们的结果中。长数组是这样构建的-通过串联从递归调用FizzBu​​zz返回的数组来实现。

答案 2 :(得分:0)

此行

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

可以解释为“将我们刚刚为n收集的结果附加到我们为f(n - 1)生成的结果之后。” “在b后面加上a”表示“在b之后加上a”。先想想这将对n == 2产生什么影响。