Java递归函数技巧



谁能解释一下这个程序的输出?为什么第二个值是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是一个成员变量,因此它不为obj1obj2所共享。每个都有自己的值(分别为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在函数调用中传递对象变量的地址。

  1. 第一个2将是obj1.go(obj1)调用的结果,这将是obj1状态值的增量。
  2. obj2.go(obj2)被调用时,下一个输出将是7,由于obj2的状态值为2触发if语句并将状态值更改为5,然后以原始参数的相同地址再次调用递归函数go(this)。这一次没有调用if语句,函数只是返回一个递增的值,即6。然后,控件返回到原始函数,函数返回该值的增量,即7,并将其打印在输出中。

最新更新