Java 操作顺序



我在理解 Java 中的堆栈和操作顺序时遇到了一些问题。如果我有以下几点:

operation(7, 2)
public int operation(int x, int y) {
    if (x == y)
        return 0;
    else
        return operation(x – 1, y) + 2;
}

结果会怎样?有人告诉我它应该是单个数字结果,但我不明白 (x – 1, y( + 2 怎么可能是单个数字。我已经把它弄到:

(x – 1, y) + 2
(7 - 2, 2) + 2
(5, 2) + 2

但是我不明白在最后添加 2 的方法。这不需要返回用逗号分隔的两个值吗?

这不需要返回用逗号分隔的两个值吗?

不。

operation(x – 1, y) + 2是一个递归函数。

operation(7 - 1, 2) + 2 => operation(6, 2) + 2 这将调用带有参数 6 和 2 的 operation 函数(类似于您执行初始调用的方式(。此调用最终将以一个数字结束,该数字将添加并返回 2。

采用较小的数字以获得更好的可视化operation(4, 2)

operation(4, 2) -> return operation(3, 2) + 2
operation(3, 2) -> return operation(2, 2) + 2
operation(2, 2) -> return 0 (the base case)
.. stack unwinds
operation(3, 2) -> return 0 + 2
operation(4, 2) -> return 2 + 2
operatation(7, 2) returns -> 8 + 2 = 10
   operatation(6, 2) returns -> 6 + 2 = 8
       operatation(5, 2) returns -> 4 + 2 = 6
          operatation(4, 2) returns -> 2 + 2 = 4
             operatation(3, 2) returns -> 0 + 2 = 2
               operatation(2, 2) returns -> 0 

归调用将一直进行,直到 x 和 y 值相等,在这种情况下,operation返回0 。然后将返回值添加到2并返回给调用方,即 0 + 2 = 2,依此类推,直到返回第一个调用方。因此,答案是10 .

实际上

,这最终大致相当于一个for循环。此代码的结果与operation(7, 2)完全相同:

int equivOfOperation = 0;
for (int i = 2; i < 7; i++)
{
    equivOfOperation += 2;
}

递归函数最终将执行等效的

for (int i = y; i < x; i++)

当然,假设y < x.(在这种情况下,operation最终会得到无限递归(。

由于其他几个答案已经显示了递归的痕迹,所以我不会在这里重复,但你可能想浏览它们的痕迹,并说服自己这与for循环具有相同的效果。

最新更新