在这里无法理解递归

时间:2018-09-18 04:59:29

标签: java recursion while-loop

有人可以帮我解释一下为什么这会导致无限递归循环吗?

变量长度达到值1,但由于某种原因,即使循环条件为while(length> 1),仍会进入循环。

我尝试打印值并一遍又一遍地运行它,也许我错过了一些显而易见的东西,或者有人可以更简单地解释这一点。谢谢。

public static void main(String[] args) {
    xMethod(5);
}

public static void xMethod(int length) { 
    while (length > 1) {
        System.out.print((length - 1) + " ");
        xMethod(length - 1);
    }
}

其他信息。

当我调试此代码时:

public static void main(String[] args) {
    xMethod(5);
}

public static void xMethod(int length) { 
    while (length > 1) {
        System.out.print((length - 1) + " ");
        xMethod(length - 1);
    }
    System.out.println("Coming out of while");
}

下面是输出:

4 3 2 1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
1 Coming out of while
//repeated Infinite times

退出while循环后,为什么又回到while为2的同一length循环中?

编辑:感谢您的所有答复,并理解如果我想像这样编写代码,我可能会像大多数递归方法一样使用if语句,但这只是我的一个问题,也许我不了解范围或调用的方式堆栈工作。如果我是正确的,则无论该循环之外发生什么,while循环块都将length的值保持为2?

4 个答案:

答案 0 :(得分:2)

因为您没有在当前方法中更新length的值。发送到方法时,该值只是递减。

public static void main(String[] args) {
    xMethod(5);
}

public static void xMethod(int length) {
    while (length > 1) {
        System.out.print((length) + " ");
        xMethod(length);
        length--;
    }
}

答案 1 :(得分:2)

可变长度在任何循环中都不会达到值1,您混合使用两种设计,我认为您需要使用它们,即递归方法或循环。

第一个设计:

public static void main(String[] args) {
    xMethod(5);
}
public static void xMethod(int length) { 
    System.out.print((length - 1) + " ");
    if(length > 1)
        xMethod(length - 1);
    }
}

另一种方式:

public static void main(String[] args) {
    xMethod(5);
}
public static void xMethod(int length) {
    while (length > 1) {
        System.out.print((length--) + " ");
    }
}

您可以选择其中之一,这取决于您的设计。 如果不是您的答案,请写出您的期望输出。

答案 2 :(得分:2)

您在这里做两件事。在编写递归代码时,您始终需要考虑何时代码何时结束。您的代码没有结尾。

public static void main(String[] args) {
             xMethod(5);
}

public static void xMethod(int length) { 

     System.out.println("Method Start "+ length);
        while (length > 1) {

            System.out.println("Inside while "+ length);

             xMethod(length - 1);
        }
        System.out.println("Method End "+ length);                 
    }
}

现在此代码将产生以下输出:

Method Start 5
Inside while 5
Method Start 4
Inside while 4
Method Start 3
Inside while 3
Method Start 2
Inside while 2
Method Start 1
Method End 1
Inside while 2
Method Start 1
Method End 1
Inside while 2
Method Start 1
Method End 1
Inside while 2
Method Start 1
Method End 1
.
.

您可以清楚地看到

Inside while 2
Method Start 1
Method End 1

一次又一次地重复。

这意味着,当长度为2时,将发生以下情况。

while (2 > 1) {
     System.out.println("Inside while "+ length);
     xMethod(1);
}

此输出为

Inside while 2

现在,xMethod(1)甚至都没有进入while循环,因此将被打印出来。

Method Start 1
Method End 1

但是您现在应该了解while(2>1)再次被执行,因为长度没有改变并且仍然是2

while (2 > 1){
    System.out.println("Inside while "+ length);
    xMethod(1);
}

继续,循环继续。

答案 3 :(得分:0)

因为length到达2 xMethod(2)时被调用,因此xMethod(1)随后xMethod(1)结束时,由于length仍为{{ 1}}再次调用2,然后再次调用xMethod(2)

要修复此问题,请在xMethod(1)之后使用return

xMethod(length - 1);