Java操作顺序

时间:2018-04-09 16:11:23

标签: java operator-precedence

我在了解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的方法。这不需要返回用逗号分隔的两个值吗?

3 个答案:

答案 0 :(得分:4)

  

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

不。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

实际上,这最终大致相当于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将以无限递归结束。)

由于其他几个答案已经显示了递归的痕迹,我在此不再重复,但你可能想要走过它们的痕迹并说服自己这与{{1}具有相同的效果}循环。