Java递归函数技巧

时间:2016-09-24 06:07:02

标签: java recursion

有谁可以解释这个程序的输出?为什么它是第二个值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

3 个答案:

答案 0 :(得分:3)

需要注意的重要一点是state是一个成员变量,因此不会在obj1obj2之间共享。每个都有自己的值(分别为1和2)。

为什么obj2的输出7?条件(this.state == 2)对于obj2是正确的,因此您递归进入go(this)。现在条件不再正确,因为state已更改为5,因此state会增加。递归调用结束,您现在返回调用函数(在go(this)之后)并且state再次递增。因此,5 + 1 + 1 = 7。

答案 1 :(得分:1)

程序的输出将为27(不含空格)。这是由于java在函数调用中传递了对象变量的地址。

  1. 第一个2将是调用obj1.go(obj1)的结果,这将是obj1的状态值的增量。
  2. 调用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}}