Java Recursive Method它是如何工作的?

时间:2015-03-21 21:09:21

标签: java recursion

我对Java编程比较陌生,我刚刚开始学习递归,但我似乎无法弄清楚这种方法是如何起作用的。

   private static int mystery(int w) {
    {
        if (w < 0) return 0;
        int x = mystery (w-2);
        return w - x;
    }
}

每当输入100这样的变量时,输出50.当输入200时,输出100.当输入2时,输出2.当输入25时,输出13。我不确定这种方法是如何工作的,我正试图绕过它。

我目前查看它的方式,如果你输入100,它将绕过第一个return语句,因为它大于0。 当它到达第二行时,它将执行100-2,这将带来98,然后进入第三行并执行100 - 98 = 2.然后返回到原始调用。

我知道我搞砸了神秘(w-2)方法的第二行。我假设它会再次将w-2的结果带回到方法的开头,并且它会一遍又一遍地继续执行该方法,直到w小于0,无论答案如何,都应该再次输出0。但事实并非如此,我不知道为什么。

有谁能解释这里发生了什么?

3 个答案:

答案 0 :(得分:13)

你缺少的是,在第二行它不会做w - 2,但自称用w - 2.它不会进一步直到呼叫返回。如果w不是&lt;&lt; t&lt; 0等等,直到达到低于0的值然后返回。如果您想象它,执行将是这样的:

mystery(10)
    > skip first line
    > x = mystery(8)
        > skip first line
        > x = mystery(6)
            > skip first line
            > x = mystery(4)
                > skip first line
                > x = mystery(2)
                    > skip first line
                    > x = mystery(0)
                        > skip first line
                        > x = mystery(-2)
                            > return 0
                        > return 0 - 0 (0)
                    > return 2 - 0 (2)
                > return 4 - 2 (2)
            > return 6 - 2 (4)
        > return 8 - 4 (4)
    > return 10 - 4 (6)

以w = 10为例。我希望你现在能更好地理解它。

答案 1 :(得分:0)

   private static int mystery(int w) {
    {
        if (w < 0) return 0;
        int x = mystery (w-2);
        return w - x;
    }
}

让我们假设我们打电话给mystery(3)。怎么了? w<0)为false,因此我们不返回0.在下一行中,我们使用值3-2 = 1作为参数调用一个名为mystery的函数。 尽管我们调用的函数恰好与我们刚刚调用的函数相同,但它仍然是一个普通的函数调用,它返回一个值。它通过调用名为mystery的函数来完成此操作,这次使用值-1作为参数。这次w<0是真的,所以我们只返回0.现在我们回到mystery的第二次调用,我们设置x = 0.所以该调用返回w - 0 =这使我们回到第一次调用,现在x = 1,所以我们返回wx = 3-1 = 2.

您可能需要花几分钟时间使用w = 4来解决这个问题,看看你得到了什么 - 这将有助于您了解递归调用的工作原理。 在你完成这个之后,我建议你在函数中添加一两个打印语句,告诉你你在哪里以及发生了什么,这也会有所帮助 - 但是先在纸上做。

答案 2 :(得分:0)

两个给出的答案非常好。两者都侧重于如何掌握递归的方式。递归的问题在于,对于不知道递归是什么,或者不知道有人做过的人来说,它是如此不自然。它像一条蛇一次又一次地吃着自己。

理解递归的最好方法是记下对递归方法的调用,通过在调用时调用当前状态,并在调用后写回结果。你把这些电话堆叠起来,这也是不使用递归的方法。

所以一开始不要太努力去理解递归,但首先要关注程序流程。如果你已经看到了足够的递归,它会来找你。