java中的递归方法

时间:2014-04-30 21:15:09

标签: 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 {

    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;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您的理解是正确的。您可以通过逐步调试调试器中的代码来自行验证。

答案 1 :(得分:0)

您的理解和代码是正确的。我建议的是,没有必要在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);
        }
    }
}

答案 2 :(得分:0)

ps(前脚本)

我让代码不干净,尽可能少改变OP的代码。为了额外的功劳,您可以尝试简化上述任何/所有示例,以便它们不会同时使用if和else块,但只需要一个if块,同时还要删除所有返回语句。 / p>

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


是的,你的理解是正确的。

然而,一个澄清

我想你已经知道了,但你的代码不会打印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

在两种情况下都执行打印,但是在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);
}

PS

  • meriton关于使用调试器的说法,调试器是你的朋友。在编码时,我建议使用EclipseIntelliJ IDEA。我已经使用Eclipse多年了,但由于谷歌似乎正朝着它的Android开发方向迈向IntelliJ IDEA,所以它也值得一试。