我已经查看过论坛,我看到一些标题相似但没有一个能回答我的问题。我注意到如果我创建一个递归函数,返回语句会在它看起来像终止语句之后返回。有人可以向我解释这如何工作吗?谢谢
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"
我希望它为函数的每个实例返回 A,因为我认为函数定义中的每个语句都会为函数的每个实例调用,如下所示:
10
"A"
9
"A"
8
"A"
7
"A"
6
"A"
5
"A"
4
"A"
3
"A"
2
"A"
1
"A"
所以重申一下为什么函数没有像我预期的那样返回 A,我误解了函数的运行方式是什么?
最佳答案
这样计算可能有助于您理解:
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)
返回 "AAAAAAAAAA"
。
您每次打印 n
的值,一个整数,不打印 each 递归调用的结果>重复出现
。您在最后看到的 "AAAAAAAAAA"
是控制台(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'
关于javascript - 有人可以解释 return 语句如何与 javascript 中的递归一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785908/