我在了解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的方法。这不需要返回用逗号分隔的两个值吗?
答案 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}具有相同的效果}循环。