你能告诉我这个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:对不起,我没有提到我知道这段代码的结果,但只是想知道执行的步骤。
8条答案
按热度按时间dzjeubhm1#
上面印着432111111 ...
然后陷入循环中,因为在while循环的作用域中没有任何东西修改len。(len=5,4,然后3)执行一次循环迭代,并等待Strangemethod返回。当len=2时,while循环调用strangemethod(1),并且因为len不大于1,while循环结束,调用返回,但是在最下面的whle循环中len仍然是2,所以它一次又一次地调用strangemethod(2)。
if()比while()更合适。
s5a0g9ez2#
如果我没弄错的话,这不是导致了一个无限循环吗?
一旦strangemethod(1)返回,strangemethod(2)将再次打印1,然后再次调用strangemethod(1)。
你是不是忘了在奇怪的方法调用后递减len?
6za6bjd03#
编辑:对不起,对于第一个答复没有意识到它..这将导致一个无限循环
下面是一个简单的流程-例如len =5
指纹43211.....
cnh2zyt34#
你没有说你期望代码做什么。但是,很明显的一点是
len
变量并不改变Strangemethod
方法中的值--它可以被声明为final
。你可能想做的是用--len;
(相当于len = len - 1;
)递减它。eanckbw95#
尝试在
Strangemethod(len - 1);
之后添加len--;
,这样就不会进入无限循环。ha5z0ras6#
此代码将永远循环。
len - 1
的结果永远不会存储在while循环中,所以它无法退出,当len = 2
时,它只会在那里输出1。在递归函数中使用
while
是不常见的,我通常希望在它的位置上看到if
,它会给予以下输出:如果你真的需要
while
,我会把循环重写成这样:这将输出:
sshcrbum7#
我知道我迟到了13年,但我在大学的一次测验中遇到了这个问题,我答错了,我不明白为什么它会这样。所以我花了一些时间,我相信我可以用一种对每个人都有意义的方式来解释它。
在方法调用strangeMethod(5)内声明的while循环的
Iteration #1.
;因为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.
;在方法调用strangeMethod(3)内声明的while循环的
Iteration #1.
;在方法调用strangeMethod(2)内声明的while循环的
Iteration #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.
;在方法调用strangeMethod(2)中声明的while循环的
Iteration #3.
;现在,如果这仍然不能创造出令人惊叹的时刻,请考虑执行以下操作,通过添加一个简单的
if
块来调整代码或
如果有人觉得我的答案有帮助,我将非常感谢你的投票。
yacmzcpb8#
另外,我认为应该有人指出len是从不递减的,所以你会得到一个无限循环。我看到到目前为止只有7个人提到过这一点。