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) + " ");
    }