有人能解释一下在javascript中返回语句是如何与递归一起工作的吗?

有人能解释一下在javascript中返回语句是如何与递归一起工作的吗?,javascript,recursion,Javascript,Recursion,我已经检查了论坛,我看到了一些类似的标题,但没有一个回答我的问题。我注意到,如果我创建一个递归函数,return语句将在termination语句之后返回。有人能给我解释一下这是怎么回事吗?谢谢 function recur(n=10){ if(n===0){ return ""; } console.log(n); return "A" + recur(n-1); } recur() 最终结果是: 10 9 8 7 6 5 4 3 2 1 "AAAAAAAAAA"

我已经检查了论坛,我看到了一些类似的标题,但没有一个回答我的问题。我注意到,如果我创建一个递归函数,return语句将在termination语句之后返回。有人能给我解释一下这是怎么回事吗?谢谢

function recur(n=10){
  if(n===0){
    return "";
  }
  console.log(n);
  return "A" + recur(n-1);
}

recur()
最终结果是:

10
9
8
7
6
5
4
3
2
1
"AAAAAAAAAA"
我希望它为函数的每个实例返回一个,因为我认为函数定义中的每个语句都会为函数的每个实例调用,如下所示:

10
"A"
9
"A"
8
"A"
7
"A"
6
"A"
5
"A"
4
"A"
3
"A"
2
"A"
1
"A"

因此,为了重申为什么函数没有像我预期的那样返回,我误解了函数的运行模式是什么?

我假设您是在浏览器控制台、节点shell或类似的环境中执行此操作的。代码输出参数的每个值(0除外),并且根本不输出任何“A”。shell/控制台只是回显函数返回的值;在这种情况下,您可以对
recur()
进行顶级调用。顶级调用计算为“aaaaaa”的原因是,每个函数调用都会在递归调用的值后面附加一个“A”。(n===0的基本大小写返回一个空字符串。)


如果每次都要打印“A”,则必须向代码中添加自己的输出语句。shell返回后仍将打印顶级调用的返回值。

您正在从函数返回“A”,而不是每次都打印它。New
A
连接到每个递归调用的返回值。要获得您想要的结果,您应该执行以下操作:

function recur(n=10){
  if(n===0){
    return "";
  }
  console.log(n);
  console.log("A");
  return recur(n-1);
}

这样做可能有助于您理解:

recur(5) = "A" + recur(4)
         = "A" + ("A" + recur(3))
         = "A" + ("A" + ("A" + recur(2)))
         = "A" + ("A" + ("A" + ("A" + recur(1))))
         = "A" + ("A" + ("A" + ("A" + ("A" + recur(0)))))
         = "A" + ("A" + ("A" + ("A" + ("A" + ""))))
         = "A" + ("A" + ("A" + ("A" + ("A"))))
         = "A" + ("A" + ("A" + ("AA")))
         = "A" + ("A" + ("AAA"))
         = "A" + ("AAAA")
         = "AAAAA"
因此
recur(5)
返回
“AAAAA”
。您应该能够扩展此推理,以显示
recur(10)
返回
“aaaaaaaa”

每次打印的是
n
的值,一个整数,而不是每次递归调用
recur
的结果。您在末尾看到的
“aaaaaaaa”
是控制台(shell、REPL等)的结果,显示您执行的所有操作的结果;在本例中,您可以在调用
recur()
的末尾看到这一点,这与
recur(10)
相同

如果要“跟踪”函数,可以将结果赋给变量,然后返回它。试试这个:

$ node
> function recur(n=10){
...   if(n===0){
.....     return "";
.....   }
...   let result = "A" + recur(n-1);
...   console.log(n, result);
...   return result;
... }
undefined
> recur()
1 'A'
2 'AA'
3 'AAA'
4 'AAAA'
5 'AAAAA'
6 'AAAAAA'
7 'AAAAAAA'
8 'AAAAAAAA'
9 'AAAAAAAAA'
10 'AAAAAAAAAA'

试着运行这个,它可能会使发生的事情更加直观

function recur(n=10){
  if(n === 0){
    return "";
 }
 var recursiveResult = "A" + recur(n-1);
 console.log(n);
 console.log(recursiveResult);

 return recursiveResult;
}

console.log(recur(10));
递归函数不应该为递归函数的每个“循环”返回相同的结果。否则,您不需要递归:)

避免使用“函数实例”来表示“函数调用”。从技术上讲,它们是完全不同的。代码示例中有一个
recur
实例,它被调用(即调用)11次

前十个调用都不能返回,直到它们返回的表达式
(“A”+recur(n-1)
)。已经过评估。第十一次调用首先返回。前面的调用在返回的表达式完成求值之后和之后,按与调用相反的顺序返回