有谁可以解释这个程序的输出?为什么它是第二个值7?
无法理解递归函数调用go(this)
public class ThisIsTricky {
int state = 0;
public ThisIsTricky(int s) {
state = s;
}
public static void main(String[] args) {
ThisIsTricky obj1 = new ThisIsTricky(1);
ThisIsTricky obj2 = new ThisIsTricky(2);
System.out.println(obj1.go(obj1) + "" + obj2.go(obj2));
}
int go(ThisIsTricky thisIsTricky) {
if (this.state == 2) {
thisIsTricky.state = 5;
go(this);
}
return ++this.state;
}
}
输出: -
2 7
答案 0 :(得分:3)
需要注意的重要一点是state
是一个成员变量,因此不会在obj1
和obj2
之间共享。每个都有自己的值(分别为1和2)。
为什么obj2
的输出7?条件(this.state == 2)
对于obj2
是正确的,因此您递归进入go(this)
。现在条件不再正确,因为state
已更改为5,因此state
会增加。递归调用结束,您现在返回调用函数(在go(this)
之后)并且state
再次递增。因此,5 + 1 + 1 = 7。
答案 1 :(得分:1)
程序的输出将为27
(不含空格)。这是由于java在函数调用中传递了对象变量的地址。
2
将是调用obj1.go(obj1)
的结果,这将是obj1的状态值的增量。7
时,下一个输出为obj2.go(obj2)
,而 obj2的状态值为2会触发if
语句,并将状态值更改为5
。然后使用原始参数的相同地址再次调用递归函数go(this)
。这次没有调用if
语句,函数只返回一个递增的值,即6
。然后控件返回到原始函数,函数返回该值的增量,即7
,并在输出中打印。 答案 2 :(得分:1)
'obj1':'state = 1'和'1!= 2'所以返回1 + 1 = 2.
'obj2'解开递归时更容易理解:
State = 2 so we enter the conditional clause: Set state=5 Recursively call to 'go' state is 5 and 5!=2. So skip conditional clause increment state, state is now 5+1=6 return 6 Back in the original call to 'go', increment state, state is now 6+1=7 return 7
因此,输出为{{1}}