谁能解释一下这个程序的输出?为什么第二个值是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
需要注意的是,state
是一个成员变量,因此它不为obj1
和obj2
所共享。每个都有自己的值(分别为1和2)。
为什么obj2
的输出是7 ?对于obj2
,条件(this.state == 2)
为真,因此递归进入go(this)
。现在条件不再为真了,因为state
被改成了5,所以state
增加了。递归调用结束,现在返回到调用函数(在go(this)
之后),state
再次递增。因此,5+1+1 = 7
'obj1': 'state=1' and '1!=2'所以返回1+1= 2
'obj2'在解递归时更容易理解:
<>之前State = 2,所以我们进入条件从句:设置状态= 5递归调用'go'状态是5,5!=2。跳过条件从句增量状态,状态现在是5+1=6返回6回到最初的"go"调用,增加状态,状态现在是6+1=7返回7之前因此,输出为27
程序的输出将是27
(不含空格)。这是由于java在函数调用中传递对象变量的地址。
- 第一个
2
将是obj1.go(obj1)
调用的结果,这将是obj1状态值的增量。 - 当
obj2.go(obj2)
被调用时,下一个输出将是7
,由于obj2的状态值为2触发if
语句并将状态值更改为5
,然后以原始参数的相同地址再次调用递归函数go(this)
。这一次没有调用if
语句,函数只是返回一个递增的值,即6
。然后,控件返回到原始函数,函数返回该值的增量,即7
,并将其打印在输出中。