【问题标题】:Java Recursive Method how does it work?Java 递归方法是如何工作的?
【发布时间】:2015-03-22 05:39:30
【问题描述】:

我对 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。但这不是发生的事情,我不知道为什么。

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

【问题讨论】:

  • 阅读 SICP 书,它解释了这一点以及编程中的许多其他重要思想。还要确保正确格式化您的代码,否则一些愤怒的程序员会否决您的问题。
  • 直到第二行解决后才进入第三行。在上面的例子中,当你到达神秘(w-2)时,你调用神秘(98)......然后在那个调用内部,它会在第二行调用神秘(96)......
  • 在函数上添加一些 println 调用并运行它。
  • 此外,此代码将在较大的w 值上溢出堆栈

标签: java recursion


【解决方案1】:

您缺少的是,在第二行它不只是执行 w - 2,而是使用 w - 2 调用自身。在调用返回之前它不会走得更远。如果 w 不

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 为例。希望你现在能更好地理解它。

【讨论】:

  • 调试递归时,将相同的文本发送到控制台会很有用。添加一个随着每次调用而增长的缩进参数和一些system.out.printlins 应该足以做到这一点。
【解决方案2】:
   private static int mystery(int w) {
    {
        if (w < 0) return 0;
        int x = mystery (w-2);
        return w - x;
    }
}

假设我们调用mystery(3)。怎么了? w&lt;0) 为假,因此我们不返回 0。在下一行中,我们调用了一些名为 mystery 的函数,使用值 3-2=1 作为其参数。 尽管我们调用的这个函数恰好与我们刚刚调用的函数相同,但它仍然是一个普通的函数调用,它返回一个值。它通过调用名为mystery 的函数来执行此操作,这次使用值-1 作为参数。而这一次w&lt;0 为真,所以我们只返回 0。现在我们回到对mystery 的第二次调用,我们设置 x = 0。所以该调用返回 w - 0 = 1。我们回到第一次调用,现在 x = 1,所以我们返回 w-x = 3-1 = 2。

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

【讨论】:

    【解决方案3】:

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

    理解递归的最好方法是写下对递归方法的调用,方法是在调用它时不考虑当前状态,然后在调用后写回结果。您将调用堆叠起来,这也是完全不使用递归的方法。

    所以一开始不要太努力去理解递归,而是首先关注程序流程。如果你见过足够多的递归,它就会来找你。

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2012-10-04
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多