循环内部的递归,它是如何工作的?

时间:2010-06-18 14:57:45

标签: java recursion while-loop

你能告诉我这个java代码是如何工作的吗? :

public class Main {
    public static void main (String[] args)  {
        Strangemethod(5);
    }
    public static void Strangemethod(int len) {
        while(len > 1){
            System.out.println(len-1);
            Strangemethod(len - 1);
        }
}
}

我尝试调试它并一步一步地遵循代码,但我不明白。

更新:对不起我没有提到我知道这段代码的结果,但只是想知道执行的步骤..

7 个答案:

答案 0 :(得分:13)

那将打印4 3 2 1 1 1 1 1 1 ...

并且陷入循环,因为没有任何东西在while循环的范围内修改len。第一次调用(len = 5,4,然后是3)经历一次循环迭代,并等待Strangemethod返回。当len = 2时,while循环调用strangemethod(1),并且由于len不大于1,while循环结束并且该调用返回。但len仍然是最底部剩余的whle循环中的2,所以它再次称为奇怪的方法(2)。然后再次。再一次。

if()比while()更合适。

答案 1 :(得分:2)

  

编辑:抱歉第一个回复没有   意识到它......会造成无限的   环

这是一个简单的流程 - 例如len = 5

 public static void Strangemethod(5) {
            while(5 > 1){
                System.out.println(5-1);
                Strangemethod(5 - 1);
            }
public static void Strangemethod(4) {
            while(4 > 1){
                System.out.println(4-1);
                Strangemethod(4 - 1);
            }
public static void Strangemethod(3) {
            while(3 > 1){
                System.out.println(3-1);
                Strangemethod(3 - 1);
            }
    public static void Strangemethod(2) {
            while(2 > 1){
                System.out.println(2-1);
                Strangemethod(2 - 1);
            }
    public static void Strangemethod(1) {
            while(1 > 1){//goes back to original(above) call and then an infinite loop since len was never  decremented

            }

打印4 3 2 1 1 .....

答案 2 :(得分:2)

如果我没有弄错的话,这不会导致无限循环吗?

一旦奇怪的方法(1)返回奇怪的方法(2)将再次打印1然后再次调用strangemethod(1)。

在奇怪的方法召唤之后,你是否忘记减去len?

答案 3 :(得分:1)

您没有说出您希望代码执行的操作。但是,显而易见的是,len变量并未改变Strangemethod方法中的值 - 它可能已声明为final。可能你想做的就是用--len;递减它(相当于len = len - 1;)。

答案 4 :(得分:1)

尝试在len--;之后添加Strangemethod(len - 1);。它不会让你进入无限循环。或者,你可以做

System.out.println(--len);
Strangemethod(len);

答案 5 :(得分:0)

此代码将永远循环。

len - 1的结果永远不会存储在while循环中,因此无法退出,len = 2只会在那里输出1。

在递归函数中使用while是不常见的。我通常希望在其位置看到if,这将为您提供输出:

4
3
2
1

如果你确实需要while,那么我会像这样重写循环:

while(len > 1)
{
  len--;
  System.out.println(len);
  Strangemethod(len);
}

这将输出:

4
3
2
1
1
2
1
1
3
2
1
1
2
1
1

答案 6 :(得分:-3)

另外,我认为有人应该指出len永远不会减少,所以你得到一个无限循环。我看到到目前为止只有7人提到过。