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
是尾部递归的,而它显然有两个递归调用?”