【问题标题】:Java Order of OperationJava 操作顺序
【发布时间】:2018-04-09 16:11:22
【问题描述】:

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

【问题讨论】:

  • 您的意思是“单个数字”而不是“单个数字”?它必须是单个数字结果,因为结果是 int。 (我也不明白为什么它会是个位数)
  • 递归公式实际上是2*(x-y) 其中x >= y(如果x

标签: java operator-precedence


【解决方案1】:

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

不。

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

【讨论】:

  • 谢谢。递归编程很难掌握。
【解决方案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

【讨论】:

    【解决方案3】:

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

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

    递归函数最终会做相当于

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

    当然,假设y &lt; x。 (在这种情况下,operation 会以无限递归结束。

    由于其他几个答案已经显示了递归的痕迹,我不会在此重复,但您可能想遍历它们的痕迹并说服自己这与 for 循环具有相同的效果.

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 2017-11-07
      • 2015-07-07
      • 2021-10-25
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多