首页 > 解决方案 > 递归 FizzBu​​zz - 为什么我不能反转我的数组?

问题描述

我正在学习递归函数。为了好玩,我尝试了 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 不正确,有没有办法让它工作?提前致谢!

标签: javascriptrecursionfizzbuzz

解决方案


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

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' ]

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


推荐阅读