我已经检查了论坛,我看到一些有类似标题但没有一个回答我的问题。我注意到如果我创建一个递归函数,则return语句在终止语句之后返回。有人能解释一下这对我有用吗?感谢
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,函数如何运作的模式我误解了?
答案 0 :(得分:4)
这样做可能有助于您理解:
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
的值,一个整数,不打印每个递归调用recur
的结果。最后看到的"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'
答案 1 :(得分:2)
我假设你在浏览器控制台,节点shell或类似的东西中执行此操作。代码输出参数的每个值(除非它是0)并且不输出任何" A"一点都不shell /控制台只是回显函数返回的值;在这种情况下,您是对recur()
的顶级电话。顶级呼叫评估为" AAAAAAAAAA"是每个函数调用附加一个" A"到递归调用的值。 (n===0
的基本案例返回一个空字符串。)
如果你想打印" A"每次,您都必须将自己的输出语句添加到代码中。 shell返回后仍然会打印顶级调用的返回值。
答案 2 :(得分:2)
您正在从函数返回'A',而不是每次都打印它。新的A
连接到每个递归调用的返回值。您想要的结果应该是:
function recur(n=10){
if(n===0){
return "";
}
console.log(n);
console.log("A");
return recur(n-1);
}
答案 3 :(得分:1)
尝试运行此功能,可能会让您更直观地了解正在发生的事情。
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));
递归函数不应该为每个"循环"返回相同的结果。递归函数。否则,你不需要递归:)。
答案 4 :(得分:0)
避免使用“函数实例”来表示“调用函数”。从技术上讲,它们完全不同。代码示例中有一个recur
实例,被调用(即调用)11次。
前10个调用中的任何一个都不能返回,直到它们返回的表达式 ("A" + recur(n-1)')
。已被评估。第十一次调用首先返回。之前的调用以其调用的相反顺序返回,之后因为它们返回的表达式已完成评估。