javascript - 递归 FizzBuzz - 为什么我不能反转我的数组?
问题描述
我正在学习递归函数。为了好玩,我尝试了 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);
}
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 不正确,有没有办法让它工作?提前致谢!
解决方案
在您的第一个示例中,您正在反转具有单个元素的数组,然后将其与下一个递归调用返回的数组连接起来。实际上,这不会逆转任何事情,结果将从最深层次的递归开始连接在一起。
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']
数组内部作为基本情况,以确保它能够与其他递归调用连接。
推荐阅读
- php - 拉拉维尔。errno: 150 "外键约束格式不正确"
- php - PHPWord 表格边框不起作用,打开时出现 Word 文件错误
- python-3.x - 无法创建解释器 Pycharm
- jq - 如何组合 2 个独立过滤器的输出
- flutter - Flutter Key类型如何根据类型使key成为必需的?
- android - 不再支持源选项 5。在 android studio 中使用 6 或更高版本
- c# - 使平面向其指向的方向移动
- python - 如何在不下载的情况下从 AWS 中的 grib 文件中提取数据?
- python - ValueError: 层双向的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无、120、1024、1024)
- php - FireFox https 在 30 秒后超时