我试图通过在javascript中使用FizzBuzz问题来更好地理解递归
我不懂第18行?如果输入为100,程序如何首先打印数字1并以数组中的数字100结束?任何帮助都将不胜感激我试图通过在javascript中使用FizzBuzz问题来更好地理解递归,javascript,recursion,fizzbuzz,Javascript,Recursion,Fizzbuzz,我不懂第18行?如果输入为100,程序如何首先打印数字1并以数组中的数字100结束?任何帮助都将不胜感激 函数fizzBuzz(n){ //创建名为results的空数组 //为n==1时创建基本案例 //递归并将值推送到数组 var结果=[]; 如果(n==1){ 返回[1]; }否则{ 如果(n%3==0&&n%5==0){ 结果:推送('FizzBuzz') }否则如果(n%3==0){ 结果:推(嘶嘶声) }否则如果(n%5==0){ 结果:推送(“嗡嗡声”) }否则{ 结果:push
函数fizzBuzz(n){
//创建名为results的空数组
//为n==1时创建基本案例
//递归并将值推送到数组
var结果=[];
如果(n==1){
返回[1];
}否则{
如果(n%3==0&&n%5==0){
结果:推送('FizzBuzz')
}否则如果(n%3==0){
结果:推(嘶嘶声)
}否则如果(n%5==0){
结果:推送(“嗡嗡声”)
}否则{
结果:push(n);
}
返回fizzBuzz(n-1)。concat(结果);/???
}
}
控制台日志(fizzBuzz(100))代码>这行
fizzBuzz(n - 1).concat(results);
可以解释为“将我们刚刚为n
收集的结果附加到我们为f(n-1)
生成的结果中”“将a附加到b”意味着“将a放在b之后”。想想这对n==2
会有什么影响,然后一般来说。这一行
fizzBuzz(n - 1).concat(results);
可以解释为“将我们刚刚为n
收集的结果附加到我们为f(n-1)
生成的结果中”“将a附加到b”意味着“将a放在b之后”。想想这对n==2有什么作用,一般来说。首先要意识到的是,对fizzBuzz的每次调用都会返回一个数组——它不会添加到现有数组中,而是每次都创建一个新数组
因此,如果输入n是1,它只返回一个包含1的单元素数组
如果n>1,将有一个递归调用。“results”已创建为空数组,因此.push()语句向该数组添加单个元素:
如果n可被3和5整除,则数组将为['FizzBuzz']
如果n只能被3整除,则数组将为['Fizz']
如果n仅可被5整除,则数组将为['Buzz']
否则,数组将是[n]无论n是什么
由于n>1(或者我们不在这里),我们必须再次使用下一个较低的n调用FizzBuzz,并将其结果连接到我们的结果。这就是长数组的构建方式—通过将递归调用返回的数组连接到FizzBuzz。首先要意识到的是,每次调用FizzBuzz都会返回一个数组—它不会添加到现有数组中,而是每次创建一个新数组
因此,如果输入n是1,它只返回一个包含1的单元素数组
如果n>1,将有一个递归调用。“results”已创建为空数组,因此.push()语句向该数组添加单个元素:
如果n可被3和5整除,则数组将为['FizzBuzz']
如果n只能被3整除,则数组将为['Fizz']
如果n仅可被5整除,则数组将为['Buzz']
否则,数组将是[n]无论n是什么
由于n>1(或者我们不在这里),我们必须再次使用下一个较低的n调用FizzBuzz,并将其结果连接到我们的结果。这就是长数组的构建方式-将递归调用返回的数组连接到FizzBuzz。它首先使用最后一个值(对于100
)创建一个results
数组,然后使用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));
函数fizzBuzz(n){
如果(n它首先使用最后一个值(对于100
)创建一个results
数组,然后使用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));
函数fizzBuzz(n){
如果(nresults
的名称不好——它总是一个单元素列表,因此复数形式的s
是误导性的。它根本没有理由是一个列表。为什么不干脆把它称为result
,让它仅仅是一个标量,然后就是fizzBuzz(n-1)。推(result)
?@JohnColeman“results”可能名称不好,但函数必须返回一个数组-递归调用建立一个最终包含“结果”的数组results
的名称不好——它总是一个单元素列表,因此复数形式的s
是误导性的。它根本没有理由是一个列表。为什么不直接称它为result
,让它只是一个标量,然后就fizzBuzz(n-1)。推(result)
?@JohnColeman“results”可能名称不好,但函数必须返回一个数组-递归调用建立一个最终包含“结果”的数组