有人可以帮我解释一下为什么这会导致无限递归循环吗?
变量长度达到值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?
答案 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);