无法理解这个的输出

时间:2013-12-19 10:14:33

标签: java recursion operators method-call

我有这段代码......

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.

6 个答案:

答案 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)

  1. 评估条件,因为state ==2我们属于条件块。
  2. 在条件块状态内分配给5。
  3. 然后该方法调用自身(递归)。
  4. 我们再次从条件开始,这次state != 2所以我们跳过条件。
  5. 该方法返回++this.state或6并完成对其自身的调用。
  6. 执行返回第一次调用,刚刚完成条件块的执行,因此我们前往return语句++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.