递归 FizzBuzz - 为什么我不能反转我的数组?
recursive FizzBuzz - why I can't reverse my array?
我正在学习递归函数。为了好玩,我尝试了 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 不能正常运行,有什么方法可以让它运行吗?
提前致谢!
在您的第一个示例中,您正在反转具有单个元素的数组,然后将其与下一个递归调用 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'] 添加到结果数组
我正在学习递归函数。为了好玩,我尝试了 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 不能正常运行,有什么方法可以让它运行吗? 提前致谢!
在您的第一个示例中,您正在反转具有单个元素的数组,然后将其与下一个递归调用 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'] 添加到结果数组