Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我试图通过在javascript中使用FizzBuzz问题来更好地理解递归_Javascript_Recursion_Fizzbuzz - Fatal编程技术网

我试图通过在javascript中使用FizzBuzz问题来更好地理解递归

我试图通过在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

我不懂第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(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){

如果(n
results
的名称不好——它总是一个单元素列表,因此复数形式的
s
是误导性的。它根本没有理由是一个列表。为什么不干脆把它称为
result
,让它仅仅是一个标量,然后就是
fizzBuzz(n-1)。推(result)
?@JohnColeman“results”可能名称不好,但函数必须返回一个数组-递归调用建立一个最终包含“结果”的数组
results
的名称不好——它总是一个单元素列表,因此复数形式的
s
是误导性的。它根本没有理由是一个列表。为什么不直接称它为
result
,让它只是一个标量,然后就
fizzBuzz(n-1)。推(result)
?@JohnColeman“results”可能名称不好,但函数必须返回一个数组-递归调用建立一个最终包含“结果”的数组