我不明白第18行?如果输入为100,程序将如何首先打印数字1,并在数组中以数字100结尾?任何帮助将不胜感激。
function fizzBuzz(n){
//create empty array called results
//create base case for when n === 1
//recurse and push value to array
var results = [];
if(n === 1){
return [1];
} else {
if(n % 3 === 0 && n % 5 === 0){
results.push('FizzBuzz')
} else if (n % 3 === 0){
results.push('Fizz')
} else if (n % 5 === 0){
results.push('Buzz')
} else {
results.push(n);
}
return fizzBuzz(n - 1).concat(results); // ???
}
}
console.log(fizzBuzz(100));
答案 0 :(得分:2)
它首先使用最后一个值(用于results
)创建一个100
数组,然后递归创建另一个数组,其值的范围为0
至99
,最后将它们按正确的顺序连接。
您是对的,这令人困惑。更好的递归实现是
function fizzBuzz(n) {
if (n <= 0) {
return [];
}
var results = fizzBuzz(n - 1);
if (n % 3 === 0 && n % 5 === 0) {
results.push('FizzBuzz');
} else if (n % 3 === 0) {
results.push('Fizz')
} else if (n % 5 === 0) {
results.push('Buzz')
} else {
results.push(n);
}
return results;
}
console.log(fizzBuzz(100));
答案 1 :(得分:1)
首先要意识到的是,每次fizzBuzz调用都会返回一个数组-它不会添加到现有数组中,而是每次都会创建一个新数组。
因此,如果输入n为1,则仅返回其中包含1的单元素数组。
如果n> 1,将进行递归调用。 “结果”已经被创建为一个空数组,因此.push()语句向该数组添加了一个元素:
如果n被3和5整除,则数组为['FizzBuzz'] 如果n仅可被3整除,则数组将为['Fizz'] 如果n仅可被5整除,则数组将为['Buzz'] 否则,数组将是[n]等于n。
由于n> 1(否则我们就不会在这里),我们必须再次使用下一个较低的n调用FizzBuzz,并将其结果连接到我们的结果中。长数组是这样构建的-通过串联从递归调用FizzBuzz返回的数组来实现。
答案 2 :(得分:0)
此行
fizzBuzz(n - 1).concat(results);
可以解释为“将我们刚刚为n
收集的结果附加到我们为f(n - 1)
生成的结果之后。” “在b后面加上a”表示“在b之后加上a”。先想想这将对n == 2
产生什么影响。