java while循环中的递归,它是如何工作的?

yhxst69z  于 2023-02-07  发布在  Java
关注(0)|答案(8)|浏览(221)

你能告诉我这个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);
        }
}
}

我试着调试它,并按照代码一步一步地,但我不明白它。
update:对不起,我没有提到我知道这段代码的结果,但只是想知道执行的步骤。

dzjeubhm

dzjeubhm1#

上面印着432111111 ...
然后陷入循环中,因为在while循环的作用域中没有任何东西修改len。(len=5,4,然后3)执行一次循环迭代,并等待Strangemethod返回。当len=2时,while循环调用strangemethod(1),并且因为len不大于1,while循环结束,调用返回,但是在最下面的whle循环中len仍然是2,所以它一次又一次地调用strangemethod(2)。
if()比while()更合适。

s5a0g9ez

s5a0g9ez2#

如果我没弄错的话,这不是导致了一个无限循环吗?
一旦strangemethod(1)返回,strangemethod(2)将再次打印1,然后再次调用strangemethod(1)。
你是不是忘了在奇怪的方法调用后递减len?

6za6bjd0

6za6bjd03#

编辑:对不起,对于第一个答复没有意识到它..这将导致一个无限循环
下面是一个简单的流程-例如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

            }

指纹43211.....

cnh2zyt3

cnh2zyt34#

你没有说你期望代码做什么。但是,很明显的一点是len变量并不改变Strangemethod方法中的值--它可以被声明为final。你可能想做的是用--len;(相当于len = len - 1;)递减它。

eanckbw9

eanckbw95#

尝试在Strangemethod(len - 1);之后添加len--;,这样就不会进入无限循环。

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

ha5z0ras6#

此代码将永远循环。
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
sshcrbum

sshcrbum7#

我知道我迟到了13年,但我在大学的一次测验中遇到了这个问题,我答错了,我不明白为什么它会这样。所以我花了一些时间,我相信我可以用一种对每个人都有意义的方式来解释它。
在方法调用strangeMethod(5)内声明的while循环的Iteration #1.;

public static void strangeMethod(5) {
        while (5> 1) {
            System.out.println(4);
            strangeMethod(4);
        }
    }

因为5大于1,所以while块中的代码已执行,现在我们可以在控制台中看到print语句,但您需要注意的是,is that we did not run a second iteration of this while loop, in fact, we did not even finish the first iteration, it got paused midway so that it can execute the recursive call of strangeMethod(4), and it will never get a chance to finish
为了确保我们在同一页上,您对问题“while循环在调用strangeMethod(5)时执行了多少次迭代;完成?”应为not even one iteration
但是,我们确实调用了strangeMethod(4);现在这是一个新的方法调用,它里面的while循环从满足它的continuation条件开始执行,4大于1,但是,和前面的调用一样,它甚至不会完成一次迭代,它会调用strangeMethod(3);
在方法调用strangeMethod(4)内声明的while循环的Iteration #1.;

public static void strangeMethod(4) {
        while (4 > 1) {
            System.out.println(3);
            strangeMethod(3);
        }
    }

在方法调用strangeMethod(3)内声明的while循环的Iteration #1.;

public static void strangeMethod(3) {
        while (3 > 1) {
            System.out.println(2);
            strangeMethod(2);
        }
    }

在方法调用strangeMethod(2)内声明的while循环的Iteration #1.;

public static void strangeMethod(2) {
        while (2 > 1) {
            System.out.println(1);
            strangeMethod(1);
        }
    }

现在,调用strangeMethod(2);不同,因为它是strangeMethod()的唯一调用,实际上可以多次迭代。
你看,while循环的继续条件是if 2 is greater than 1,它总是为真,就像前面所有的调用一样,这个方法的不同之处在于strangeMethod(1);call不会中断和暂停while循环,它将开始执行,请查看while(1〉1)的继续条件没有满足,并且由于strangeMethod(1)的调用中没有其他代码;要使其执行strangeMethod(1);实际上将是finish,允许我们从上次中断的地方继续,即完成strangeMethod(2)的iteration #1;启动奇异方法(2)iteration #2;检查while循环的继续条件(2〉1)是否仍然为真,执行print语句,执行strangeMethod(1);调用,该调用将结束,并允许我们启动strangeMethod(2)的iteration #3;并且由于我们没有len == 1时的基本情况,因此strange方法(2);会无限地重复。
因此,strangeMethod(2)的调用;的独特之处在于,所有要在其中执行的代码实际上都会得到执行,从而允许其中的while循环进行迭代。
在方法调用strangeMethod(2)中声明的while循环的Iteration #2.;

public static void strangeMethod(2) {
        while (2 > 1) {
            System.out.println(1);
            strangeMethod(1); //Is now just some dead code 
        }
    }

在方法调用strangeMethod(2)中声明的while循环的Iteration #3.;

public static void strangeMethod(2) {
        while (2 > 1) {
            System.out.println(1);
            strangeMethod(1); //Is now just some dead code 
        }
    }

现在,如果这仍然不能创造出令人惊叹的时刻,请考虑执行以下操作,通过添加一个简单的if块来调整代码

public static void strangeMethod(2) {
                if (len == 1) {
                        System.out.println(
                                "strangemethod(1) was executed and finished, 
                                The while loop within it did not run 
                                because its condition was not met
                                Thus, allowing us to move on to the second
                                Iteration of the while loop within 
                                strangeMethod(2);"
                        );
                }
        while (2 > 1) {
            System.out.println(1);
            strangeMethod(1);
        }
    }

public static void strangeMethod(2) {
                if (len == 1) {
                    System.exit(0); // which will end all the previous 
                                    // method calls, unlike return; which will 
                                    // only end strangeMethod(1); but keep 
                                    // strangeMethod(2) still active and                                    
                                    // running
                }
        while (2 > 1) {
            System.out.println(1);
            strangeMethod(1);
        }
    }

如果有人觉得我的答案有帮助,我将非常感谢你的投票。

yacmzcpb

yacmzcpb8#

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

相关问题