Java 为什么这个while循环永远不会终止?
我真的很难理解这个概念。我在一次考试中循环了一段时间,虽然我知道打印的是什么,但我不知道为什么 代码如下:Java 为什么这个while循环永远不会终止?,java,while-loop,Java,While Loop,我真的很难理解这个概念。我在一次考试中循环了一段时间,虽然我知道打印的是什么,但我不知道为什么 代码如下: class Test { public static void xMethod(int length) { while (length > 1){ System.out.print((length - 1) + " "); xMethod(length-1); } } publi
class Test {
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);
}
}
因为
length
永远不会更新
while (length > 1){
System.out.print((length - 1) + " ");
xMethod(length - 1);
length--;
}
长度根本没有改变
class Test {
public static void xMethod(int length) {
while (length > 1){
System.out.print((length - 1) + " ");
xMethod(length-1);
//need to change the length here
}
}
public static void main(String[] args){
xMethod(5);
}
长度始终为5。您应该将长度-1替换为长度--
这里要添加的重要内容是理解赋值在Java中是如何工作的
length
的值不会更改,因为当您在方法中传递一个值,并且它进入while
循环时,循环在条件停止时停止,而不是递归xMethod(length-1)代码>您已使用。这就是为什么即使您添加长度--
它也不会打印您想要的内容
因此,为了使程序正常工作,您必须
为长度变量赋值
更改或删除递归
一旦你浏览了链接,你就会明白为什么这个值没有改变
注意:从链接中,您知道length--
等于length=length-1
,因此基本上我们必须将更新后的值分配给length
变量。正如另一个答案所指出的,您需要减少length
变量,以解决当前length=length-1
或length--
的问题。(为了更好地解释,我让我的“同事”回答)
我的答案主要是关于递归方法的使用
您可能需要的是一个简单的if
条件。递归将充当循环
public static void xMethod(int length) {
length--;
System.out.print((length) + " ");
if (length > 1){
xMethod(length);
}
}
X方法(5)>4 3 2 1
X方法(5)>1 2 3 4
因为length
永不改变,所以您认为它应该终止?为什么要在递归的同时使用循环呢?可能不是,而是你的意思是如果,那是一道考试题。我以为它终止了,但它没有。好像我不能仅仅因为刚才我更改了长度>0的代码,而它只是停留在xMethod(1)上,永远也达不到xMethod(0),所以我不能对它掉以轻心,我不明白为什么。与已经给出的其他答案相比,我不确定这是否有任何价值。@Popeye但它并不比同时发布的其他答案差,所以我不确定为什么你的评论只针对这个答案。@Pshemo我不是说它错了(这就是我没有投反对票的原因),然而,首先有其他答案提供了更好的回答。请查看关于LinkSanswer的信息,即使链接中断,他们也应该能够独立工作。链接应该作为可选附加信息的来源,而不是答案的核心。请看,@AxelH/Pshemo谢谢。非常感谢!但就像使用xMethod(length-1)时一样,这不会将下一个输入值从5更改为4吗?就像是5,4,3,2,然后是1?就因为它调用了长度为1的xMethod?非常感谢<代码>长度-1
不会更改长度
值,长度--
会更改。还要注意,唯一的区别是前缀版本(--length)的计算结果是递增的值,而后缀版本(length--)的计算结果是原始值
@DaanyalAkhtar每个方法调用为其局部变量(包括方法参数)保留堆栈内存的一部分。当您调用xMethod(5)
时,它会将5
设置为其int-length
参数,但稍后当您调用xMethod(length-1)
时,length-1
计算为4
,因此它就像调用xMethod(4)
一样,并且4
被设置为该单独方法的int-length
(在堆栈的不同部分)。换句话说,xMethod(length-1)
不会改变当前方法的length
,这意味着while(length>1)
将始终基于length
即5
,并始终将其评估为true
@Pshemo非常感谢!所以我的问题是,我正在尝试跟踪这一点,我仍然不知道为什么在xMethod(2)中它可以打印1,为什么它不能调用xMethod(1)?因为根据我的理解,如果调用xMethod(1),它将被终止,因为1不大于1。为什么,如果while循环能够调用xMethod(4)、xMethod(3)和xMethod(2),是什么阻止它调用xMethod(1)?非常感谢!对于几个问题,非常抱歉!@DaanyalAkhtar“为什么,如果while循环能够调用xMethod(4)、xMethod(3)和xMethod(2),是什么阻止了它调用xMethod(1)”您之前已经回答过,调用了xMethod(1)
,但是由于它的length
是1而(length>1){..
甚至没有迭代一次,所以它也不会打印((length-1)+>)
(否则它将打印0并调用xMethod(0)
)。之后xMethod(2)
再次循环,在打印2-1
的结果后,它再次调用xMethod(1)
,后者再次不做任何事情,并将控制流返回到xMethod(2)
,循环重复(无限打印1)。
public static void xMethod(int length) {
length--;
System.out.print((length) + " ");
if (length > 1){
xMethod(length);
}
}
public static void xMethod(int length) {
length--;
if (length > 1){
xMethod(length);
}
System.out.print((length) + " ");
}