java - 无法理解这个输出

标签 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。

最佳答案

该方法使用递归在自身内部调用自身。自 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我们陷入了条件 block 。
  2. 在条件 block 内,状态被分配为 5。
  3. 然后该方法调用自身(递归)。
  4. 我们再次从条件句开始,这次 state != 2所以我们跳过条件。
  5. 该方法返回++this.state或 6 并完成自身的调用。
  6. 执行返回到第一次调用,该调用刚刚完成执行条件 block ,因此我们转到 return 语句 ++this.state或 7。

关于java - 无法理解这个输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20678808/

相关文章:

c# - c#中运算符的问题

java - 为什么库看不到资源目录之外的资源?

java - UserDetails.equals() 未调用

javascript - (为什么)在有限 ng-repeat 中使用 "calls itself"的指令会导致无限递归的堆栈溢出吗?

c++ - 在 C/C++ 中递归查找最大差值对

c++ - 当我将 int 添加到 char ('a' + 1 时调用哪个 operator+ 函数)

java - Spring 4 中的自定义属性编辑器

java - 如果 BufferedWriter 已经关闭,为什么它会在关闭时抛出异常?

javascript - 使 Javascript 局部变量成为全局变量以进行递归循环

objective-c - << objective-c 枚举中的运算符?