【问题标题】:recursive FizzBuzz - why I can't reverse my array?递归 FizzBu​​zz - 为什么我不能反转我的数组?
【发布时间】:2021-10-08 05:10:03
【问题描述】:

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

【问题讨论】:

    标签: javascript recursion fizzbuzz


    【解决方案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);
          }
          return fizzBuzzRecursive(num - 1).concat(results);
        }
       
      }
    
    console.log(fizzBuzzRecursive(5));
    // prints [ '1', '2', 'Fizz', '4', 'Buzz' ]

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

    【讨论】:

    • 感谢您花时间给我解释:)
    • 我还有一个问题要问你。我试图将此函数的输出从数组转换为字符串。我在 return 语句的末尾添加了 join("") ,但它不起作用。我显然错过了一些东西。你介意让我知道这有什么问题吗?提前致谢。 --- return fizzBu​​zzRecursive(num - 1).concat(results).join(""); ---
    • 之所以不能在递归返回中加入join("")是因为join()Array方法,而不是String方法。在递归返回中添加join() 会将返回类型从Array 更改为String,这意味着一旦我们遇到多个递归级别,我们将在String 上调用join()。要解决此问题,您只需在函数返回后调用一次join(),即fizzBuzzRecursive(5).join("")。或者,您可以省略 join() 函数并将您的 results 变量设置为一个字符串,您可以在每次递归调用时连接到该字符串。
    【解决方案2】:

    看看下面的反转数组

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

    NB 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'] 添加到结果数组中

    【讨论】:

    • 感谢您的帮助!
    • 很高兴它有帮助,如果您觉得我的回答有用,请投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多