我有这段代码......
public class BackHanded {
int state = 0;
BackHanded(int s) {
state = s;
}
public static void main(String... hi) {
BackHanded b1 = new BackHanded(1);
BackHanded b2 = new BackHanded(2);
System.out.println(b1.go(b1) + " " + b2.go(b2));
}
int go(BackHanded b) {
if (this.state == 2) {
b.state = 5;
go(this);
}
return ++this.state;
}
}
为什么语句return ++this.state;
在第二个方法调用中执行了两次?
修改 我预计输出为2 6.但我得到了2 7.
答案 0 :(得分:2)
该方法使用递归调用自身。自state != 2
以来的第一次调用不会发生递归,但是第二次调用满足条件this.state == 2
,导致该方法递归。
int go(BackHanded b) {
if (this.state == 2) {
b.state = 5;
go(this);
}
return ++this.state;
}
}
以这种方式执行第二次调用此方法b2.go(b2)
:
state ==2
我们属于条件块。state != 2
所以我们跳过条件。++this.state
或6并完成对其自身的调用。++this.state
或7。答案 1 :(得分:0)
因为递归。首先,return
语句直接从System.out.println(b1.go(b1) + " " + b2.go(b2));
调用,然后此方法本身调用go()
方法,但这次if (this.state == 2)
未完成,因此递归会在第二次调用时中断。 / p>
这样你就可以获得这样一个callstack:
call go(b) //b.state == 2
call go(b) //b.state == 5
return ++this.state;
return ++this.state;
正如Arnaud Denoyelle的回答所述。
答案 2 :(得分:0)
由于第二个BackHanded
实例b2
的值为2,因此一旦进入方法go
,它会检查state
是否为2,因为它是,执行go
的另一个实例,因为state
不再是2,它在完成后执行return ++this.state;
,它返回到go
的第一个调用(因为它没有完成它然后执行return ++this.state;
并完成第一个go
方法调用。
如果你想在if语句中添加一个break调用只执行一次。
int go(BackHanded b) {
if (this.state == 2) {
b.state = 5;
go(this);
break;
}
return ++this.state;
}
}
答案 3 :(得分:0)
b1
初始化为1
,您执行
System.out.println(b1.go(b1) + " " + b2.go(b2));
首先看一下b1
。
值为1,if
语句未触发,执行++
且输出为2
。
现在b2
初始化为2。
if
被触发,因为值为2,值设置为5并且您再次调用recursivly。现在值为5,if
不会触发,值会增加到6.函数返回到递归调用之后,此时值已经为6并再次增加到7。输出为7
。
答案 4 :(得分:0)
when the go(b2) is called checks(b2.state==2) is true then b2.state changes to 5 then on coming to return ++(b2) called this call will return value 6 now the return statement will be as ++(6) on incrementing 6 it returns 7
答案 5 :(得分:0)
因为在seconde情况下,状态值为2,所以if (this.state == 2)
变为真state = 5
,下一行为go
,这意味着再次调用相同的方法。
在此调用状态中,值为5,返回++this.state
表示state = 6,并返回上一次调用
int go(BackHanded b) {
if (this.state == 2) {
b.state = 5;
go(this); //returned here
}
return ++this.state;
}
}
,最后一次返回++this.state
表示++ 6,表示state = 7.