你能告诉我这个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);
}
}
}
我尝试调试它并一步一步地遵循代码,但我不明白。
更新:对不起我没有提到我知道这段代码的结果,但只是想知道执行的步骤..
答案 0 :(得分:13)
那将打印4 3 2 1 1 1 1 1 1 ...
并且陷入循环,因为没有任何东西在while循环的范围内修改len。第一次调用(len = 5,4,然后是3)经历一次循环迭代,并等待Strangemethod返回。当len = 2时,while循环调用strangemethod(1),并且由于len不大于1,while循环结束并且该调用返回。但len仍然是最底部剩余的whle循环中的2,所以它再次称为奇怪的方法(2)。然后再次。再一次。
if()比while()更合适。
答案 1 :(得分:2)
编辑:抱歉第一个回复没有 意识到它......会造成无限的 环
这是一个简单的流程 - 例如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
}
打印4 3 2 1 1 .....
答案 2 :(得分:2)
如果我没有弄错的话,这不会导致无限循环吗?
一旦奇怪的方法(1)返回奇怪的方法(2)将再次打印1然后再次调用strangemethod(1)。
在奇怪的方法召唤之后,你是否忘记减去len?
答案 3 :(得分:1)
您没有说出您希望代码执行的操作。但是,显而易见的是,len
变量并未改变Strangemethod
方法中的值 - 它可能已声明为final
。可能你想做的就是用--len;
递减它(相当于len = len - 1;
)。
答案 4 :(得分:1)
尝试在len--;
之后添加Strangemethod(len - 1);
。它不会让你进入无限循环。或者,你可以做
System.out.println(--len);
Strangemethod(len);
答案 5 :(得分:0)
此代码将永远循环。
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
答案 6 :(得分:-3)
另外,我认为有人应该指出len永远不会减少,所以你得到一个无限循环。我看到到目前为止只有7人提到过。