【问题标题】:How do I use Recursion? [closed]如何使用递归? [关闭]
【发布时间】:2013-03-14 16:51:05
【问题描述】:

所以我发布了我的代码。但是这个问题只是为了帮助我理解递归到底是什么。 我知道我需要一个基本案例递归案例。 我的任务是读取用户的输入,并颠倒它的顺序。 “动物”会变成“slamina” 现在我的基本情况:如果用户输入一个空行(这是允许的)。 而我的递归案例:只要输入有字符 我正在使用字符串来存储输入,并且我可能在其中某处使用了“.charAt[0]”命令?

我正在寻找解释,以帮助我更好地编写我需要用于此作业的代码。 我在 Eclipse 上使用 Java

【问题讨论】:

  • 我没有投反对票,但这个问题并不适合 SO。请提出一个具体的问题,以便我们以具体的方式回答。事实上,如果不写一个关于递归如何工作的教程,就没有办法回答这个问题,这不是 SO 的强项。
  • @AdamGent 我一直在 Java 中使用递归。它不像 Haskell 中那样简洁这一事实并不意味着它不能被完成或教授。
  • @Armando Garcia - 好吧,我什至为你做了谷歌搜索。请阅读:danzig.jct.ac.il/java_class/recursion.html

标签: java recursion


【解决方案1】:

递归是在其执行线程中引用自身的代码。 编写递归代码的关键是识别重复模式,并且只编写一次该模式。

在您的情况下,模式是字符切换。考虑这个伪代码:

模式(字符串) reverse =(除了字符串的第一个字符之外的所有字符,反转) +(第一个字符)

第一项可以使用相同的模式,即:

模式(除字符串的第一个字符外的所有字符)

但是,为了确保它不会永远运行,必须在没有更多字符可以切换时停止它(即,如果遇到不可逆的字符串):

模式(字符串) 如果字符串长度

【讨论】:

    【解决方案2】:

    我不会尝试直接回答,因为你似乎想了解它是如何工作的,所以我会给你一个接近的递归函数示例。

    这是一个示例,说明如何使用递归将所有从 1 到 100 的数字相加(这与您想要做的很接近)。

    int sumAllNumbers(int actualNumber, int limit)
    {
       if (actualNumber < limit) return sumAllNumbers(actualNumber + 1, limit) + actualNumber;
       return actualNumber;
    }
    

    如果你知道它是如何工作的,我想你可以弄清楚如何创建一个递归函数来反转一个字符串。 你必须记住的主要事情是你必须有一个条件来停止递归。

    【讨论】:

      【解决方案3】:

      你可以这样思考这个问题:

      1. 如果字符串为空,则返回一个空字符串。

      2. 否则,删除字符串的第一个字符(我们将其命名为 c)并对剩余部分调用 reverse(我们将其命名为 cs),然后将 c 添加到末尾。

      这是一些伪代码(这不会编译,只是给你一个想法):

      reverse(String input)
        if (input.isEmpty())
          return input;
        else {
          String c = getFirstCharacterOfString(input);  //write this on your own
          String cs = getAllCharactersButTheFirst(input); //write this on your own
          return reverse(cs) + c;
        }
      

      【讨论】:

      • ... 或者 - 您可以返回最后一个字符,然后返回所有其余字符。
      • 添加一点对原帖来说可能不太明显的信息,reverse方法就是1.和2定义的递归方法。
      • @OldCurmudgeon 是的,这也可以
      • @Smit:这就是 1) 的用途
      • @tieTYT 对不起,我误解了。你的例子很清楚。我将删除我的评论。
      【解决方案4】:

      要使用recursion,您必须首先检查您的参数并决定是否应该使用recursion。如果您的参数建议您应该使用recursion,那么您应该使用带有新参数的recursion,否则您应该返回一个结果。

      您可以在同一方法中多次使用recursion

      【讨论】:

        猜你喜欢
        • 2019-08-21
        • 2012-11-12
        • 2013-03-02
        • 2019-08-09
        • 1970-01-01
        • 2013-04-29
        • 2012-12-06
        • 2021-12-04
        • 1970-01-01
        相关资源
        最近更新 更多