递归 FizzBu​​zz - 为什么我不能反转我的数组?

recursive FizzBuzz - why I can't reverse my array?

我正在学习递归函数。为了好玩,我尝试了 FizzBu​​zz 编码挑战。

我被卡住了,因为我不明白为什么我不能在递归函数中反转我的数组。

版本 1

  const fizzBuzzRecursive = num => {
    let results = [];
    if (num === 1) {
      return '1';
    } else {
      if (num % 3 === 0 && num % 5 === 0) {
        results.push('FizzBuzz');
      } else if (num % 5 === 0) {
        results.push('Buzz');
      } else if (num % 3 === 0) {
        results.push('Fizz');
      } else {
        results.push(''+ num);
      }
      newResults = results.reverse('')
      return newResults.concat(fizzBuzzRecursive(num - 1));
    }
   
  }
  
console.log(fizzBuzzRecursive(5));
// prints [ 'Buzz', '4', 'Fizz', '2', '1' ]

为了让它工作,我必须将递归函数放在另一个函数中。

版本 2

const fizzBuzz = num => {
  const fizzBuzzRecursive = num => {
    let results = [];
    if (num === 1) {
      return '1';
    } else {
      if (num % 3 === 0 && num % 5 === 0) {
        results.push('FizzBuzz');
      } else if (num % 5 === 0) {
        results.push('Buzz');
      } else if (num % 3 === 0) {
        results.push('Fizz');
      } else {
        results.push(''+ num);
      }
      return results.concat(fizzBuzzRecursive(num - 1));
    }
  }
  
  return fizzBuzzRecursive(num).reverse()
};

console.log(fizzBuzz(5));
// prints [ '1', '2', 'Fizz', '4', 'Buzz' ]

为什么版本 1 不能正常运行,有什么方法可以让它运行吗? 提前致谢!

在您的第一个示例中,您正在反转具有单个元素的数组,然后将其与下一个递归调用 return 编辑的数组连接起来。实际上,这不会反转任何东西,结果将从递归的最深层次开始连接在一起。

const fizzBuzzRecursive = num => {
    let results = [];
    if (num === 1) {
      return ['1'];
    } else {
      if (num % 3 === 0 && num % 5 === 0) {
        results.push('FizzBuzz');
      } else if (num % 5 === 0) {
        results.push('Buzz');
      } else if (num % 3 === 0) {
        results.push('Fizz');
      } else {
        results.push(''+ num);
      }
      return fizzBuzzRecursive(num - 1).concat(results);
    }
   
  }

console.log(fizzBuzzRecursive(5));
// prints [ '1', '2', 'Fizz', '4', 'Buzz' ]

要实现反转,只需交换串联的顺序,同时确保将数组内部的 return ['1'] 作为基本情况,以确保它能够与其他递归调用。

看看下面的反转数组

选项 1

let arr = ['Buzz', '4', 'Fizz', '2', '1' ];
console.log(arr); // returns ['Buzz', '4', 'Fizz', '2', '1']
arr.reverse(); 
console.log(arr); // returns ['1', '2', 'Fizz', '4', 'Buzz']

注意arr.reverse实际上修改了数组。

选项 2

function recursive(array){
    let result = [];
  array.forEach((value, index) => {
    result.unshift(value);
  })
  return result;
}  
console.log(recursive(arr)); // returns ['1', '2', 'Fizz', '4', 'Buzz']

选项2解释 循环遍历 arr 并取消移位值。 unshift() 方法将新项添加到数组的开头。

  • 第一次是将 ['Buzz'] 添加到结果数组
  • 第二次将 ['4', Buzz] 添加到结果数组
  • 第三次是将 ['Fizz', '4', 'Buzz'] 添加到结果数组
  • 第四次是将 ['2', 'Fizz', '4', 'Buzz'] 添加到结果数组
  • 第五次是将 ['1', '2', 'Fizz', '4', 'Buzz'] 添加到结果数组