我正在學習遞回函式。為了好玩,我嘗試了 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 不正確,有沒有辦法讓它作業?提前致謝!
uj5u.com熱心網友回復:
在您的第一個示例中,您使用單個元素反轉陣列,然后將其與下一個遞回呼叫回傳的陣列連接起來。實際上,這不會反轉任何內容,并且結果將從最深的遞回級別開始連接在一起。
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']陣列內部作為基本情況,以確保它能夠與其他遞回呼叫串聯。
uj5u.com熱心網友回復:
看看下面的反轉陣列
選項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'] 添加到結果陣列
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328831.html
標籤:javascript 递归 嘶嘶声
上一篇:為什么它會在它做之后逆轉操作?
