Java 尾部递归与非尾部递归
我已经用下面的定义完成了尾部递归 递归函数称为尾部递归。如果递归调用是该函数完成的最后一件事,则无需记录以前的状态。 我也检查了答案。但我仍然有一个疑问:Java 尾部递归与非尾部递归,java,recursion,tail-recursion,Java,Recursion,Tail Recursion,我已经用下面的定义完成了尾部递归 递归函数称为尾部递归。如果递归调用是该函数完成的最后一件事,则无需记录以前的状态。 我也检查了答案。但我仍然有一个疑问: public static void main(String[] args) { doit(3); } public static void doit(int n) { if (n < 1) { return; } doit(n-1); fact2(n); doit(n-
public static void main(String[] args) {
doit(3);
}
public static void doit(int n) {
if (n < 1) {
return;
}
doit(n-1);
fact2(n);
doit(n-1);
}
public static void fact2(int n) {
System.out.println(n);
}
publicstaticvoidmain(字符串[]args){
doit(3);
}
公共静态无效doit(int n){
if(n<1){
返回;
}
doit(n-1);
fact2(n);
doit(n-1);
}
公共静态无效事实2(int n){
系统输出println(n);
}
在上面的递归调用中,我们可以称之为上尾递归还是非尾递归?或者我们可以将其拆分代码说fact2(n)之后的最后一行是尾部递归,而fact2(n)之前的最后一行是非尾部递归
如果我将上述通话改为
public static void doit(int n) {
if (n < 1) {
return;
}
doit(n-1);
fact2(n);
doit(n-1);
fact2(n)
}
publicstaticvoiddoit(intn){
if(n<1){
返回;
}
doit(n-1);
fact2(n);
doit(n-1);
事实2(n)
}
这会是尾部递归吗?递归调用不是此函数完成的最后一件事,因此它不是尾部递归在两个版本中,都有多个递归调用,并且函数执行的最后一件事也不是,因此不,它不是。对于尾部递归的函数,只能有一个递归调用总数,并且它必须是函数中的最后一个。@DylanMcNamee:更准确地说,每次调用最多只能有一个递归调用。代码可以有多个具有不同递归调用的分支,只要在调用函数时执行的分支不超过一个。@ScottSauyet-我们是一致的。我的描述是关于动态行为的,你的描述是关于导致相同动态行为的静态属性。@DylanMcNamee:当然。我不认为我们不同意,只是这样的措辞可能会让人们问,“但为什么他们说函数
xyz
是尾部递归的,而它显然有两个递归调用?”