Java 递归方法是如何工作的?

标签 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。但事实并非如此,我也不知道为什么。

谁能解释一下这是怎么回事?

最佳答案

您缺少的是,在第二行,它不只是执行 w - 2,而是使用 w - 2 来调用自身。在调用返回之前,它不会进一步执行。如果 w 不 < 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 为例。希望您现在能更好地理解它。

关于Java 递归方法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29188074/

相关文章:

java - 边框布局控制..如何移动东西

java - 如何使用 Camel 写出文件并返回文件名?

java - Spring 启动: StoredCredential (Permission denied)

javascript - 在数组上使用递归

recursion - 戈朗 : some questions on channel

java - <?> 在 Android 方法签名中是什么意思?

java - 移动到移动 TCP 套接字连接

python - 存储递归函数调用的值

c# - 递归 yield

ruby - 是否可以递归地要求 Ruby 中目录中的所有文件?