java中的递归方法

java中的递归方法,java,recursion,Java,Recursion,我有这个代码,我只是想知道我对它的理解是否正确 5被传递到方法编号中,n现在等于5。if语句为false,因此它执行else语句,并执行numbers(5-1)和再次执行方法编号,并且还没有打印出n或返回 现在n=4,重复相同的方法,直到n=1,在哪一点返回?从这一点开始,它返回到n=2,跟随打印2(System.out部分),然后返回,在这一点上,它返回到n=3,打印3,然后返回..等等,一直到5 这就是我认为正在发生的事情,谁能帮我澄清一下,谢谢 public class test {

我有这个代码,我只是想知道我对它的理解是否正确

5被传递到方法编号中,n现在等于5。if语句为false,因此它执行else语句,并执行
numbers(5-1)
和再次执行方法编号,并且还没有打印出n或返回

现在n=4,重复相同的方法,直到n=1,在哪一点返回?从这一点开始,它返回到n=2,跟随打印2(System.out部分),然后返回,在这一点上,它返回到n=3,打印3,然后返回..等等,一直到5

这就是我认为正在发生的事情,谁能帮我澄清一下,谢谢

public class test {

    public static void main(String [] args){

        numbers(5);
    }

    public static void numbers (int n){

        if(n==1) return;
        else{
            numbers(n-1);
            System.out.println(n);
            return;
        }
    }
}

你的理解是正确的。您可以通过在调试器中单步执行代码来验证这一点。

您的理解和代码是正确的。我所建议的是,没有必要在
else
块中使用return语句,因为您有适当的终止条件。所以在修改后,您的代码将是这样的

public class test{
    public static void main( String[] args )
    {
       numbers(5);
    }

    public static void numbers (int n){

        if(n==1) return;
        else{
            numbers(n-1);
            System.out.println(n);
        }
    }
}
ps(预脚本) 为了尽可能少地修改OP的代码,我让代码不干净。为了获得额外的好处,您可以尝试简化上面的任何/所有示例,这样它们就不会同时使用if和else块,而只需使用一个if块,同时还可以去掉所有的return语句

祝你好运,并享受编码带来的乐趣。:)


是的,你的理解是正确的

然而,有一点需要澄清

我想你已经知道了,但是你的代码不会打印
1
。它将打印:

2
3
4
5
如果您还想打印1,那么您可以用3种不同的方式解决此问题

方法1 将
n==1
条件更改为
n==0
。这就是我要做的。这是最简单的,对我来说也是最自然的

public static void numbers (int n){

    if(n==0) return;
    else{
        numbers(n-1);
        System.out.println(n);
        return;
    }
}
方法2 将打印移到条件行之前

public static void numbers (int n){

    System.out.println(n);
    if(n==1) return;
    else{
        numbers(n-1);
        return;
    }
}
现在,您可能会猜到,这会将数字打印为

5
4
3
2
1
方法3 在这两种情况下都执行print,但在if块之后,而不是之前

public static void numbers (int n){

    if(n==1){
        // Do nothing, Don't return yet.
        //return;
    } else{
        numbers(n-1);
        // Don't return yet.
        //return;
    }
    System.out.println(n);
}
附言
  • 梅里顿说过使用调试器,调试器是你的朋友。在编码时,我建议使用or。我使用Eclipse已经很多年了,但由于谷歌似乎正朝着Android开发的IntelliJ方向发展,它可能也值得一试

看起来您的理解是正确的——但是当
n<0
?:)时会发生什么您的
else{
else{
中的
返回值
是冗余的。这是正确的,它将永远运行(stackoverflow:))您可以通过将条件更改为
if(n可能重复的空
if
子句?Yucko!只需执行
if!就可以更干净(n>1){numbers(n-1);}
后面跟着你的
println
。我同意,我试着尽可能少地修改代码。我把OP的清理作为额外的学分。提到PS。可能我应该把它移到顶部。