【问题标题】:Java recursion and integer double digitJava递归和整数双位数
【发布时间】:2011-03-08 00:22:19
【问题描述】:

我正在尝试将整数作为参数,然后使用递归将整数中的每个数字加倍。

例如doubleDigit(3487) 将返回33448877

我被困住了,因为我不知道如何读取我猜的数字中的每个数字。

【问题讨论】:

  • 不确定为什么要为此使用递归......?

标签: java recursion integer


【解决方案1】:

要使用递归执行此操作,请使用取模运算符 (%),每次除以 10 并向后累积结果字符串,直到达到基本情况 (0),这里没有什么可除的了。在基本情况下,您只需返回一个空字符串。

String doubleDigit(Integer digit) {

      if (digit == 0) {
        return "";
      } else {
        Integer thisDigit = digit % 10;
        Integer remainingDigits = (digit - thisDigit) / 10;
        return doubleDigit(remainingDigits) + thisDigit.toString() + thisDigit.toString();
      }
    }

【讨论】:

  • 这是完美的。这正是我要找的!非常感谢!我通常从不寻求编码方面的帮助,但这个让我很难过。非常感谢!
【解决方案2】:

如果您正在寻找返回 long 而不是 String 的解决方案,您可以使用以下解决方案(与 Chris' 非常相似,假设 0 作为基本情况):

long doubleDigit(long amt) {
    if (amt == 0) return 0;     
    return doubleDigit(amt / 10) * 100 + (amt % 10) * 10 + amt % 10;        
}

功能当然受限于Java中的maximum size of a long

【讨论】:

    【解决方案3】:

    我在构建 Java 程序时也做了同样的问题。这是我的解决方案,它适用于负数和正数(并为 0 返回 0)。

    public static int doubleDigits(int n) {
        if (n == 0) {
            return 0;
        } else {
            int lastDigit = n % 10;
            return 100 * doubleDigits(n / 10) + 10 * lastDigit + lastDigit;
    }
    

    【讨论】:

      【解决方案4】:

      这里不需要使用递归。

      我不再是 java 人,但我可能使用的算法的近似值是这样的(在 C# 中工作,应该直接转换为 java):

      int number = 3487;
      int output = 0;
      int shift = 1;
      while (number > 0) {
         int digit = number % 10;                 // get the least-significant digit       
         output += ((digit*10) + digit) * shift;  // double it, shift it, add it to output
         number /= 10;                            // move to the next digit
         shift *= 100;                            // increase the amount we shift by two digits
      } 
      

      这个解决方案应该可以工作,但是现在我已经麻烦了编写它,我意识到将数字转换为字符串并对其进行操作可能更清楚。当然,那会慢一些,但你几乎肯定不会在意这么小的速度差异 :)

      编辑: 好的,所以你必须使用递归。你已经接受了一个完美的答案,但这是我的:)

      private static long DoubleDigit(long input) {       
          if (input == 0) return 0;                      // don't recurse forever!
          long digit = input % 10;                       // extract right-most digit
          long doubled = (digit * 10) + digit;           // "double" it
          long remaining = input / 10;                   // extract the other digits
          return doubled + 100*DoubleDigit(remaining);   // recurse to get the result
      }
      

      请注意,我已切换到 long,因此它可以使用更多数字。

      【讨论】:

      • 不幸的是,除了您的代码很完美之外,我还必须使用递归。我的任务是在这个上使用递归:/
      【解决方案5】:

      您可以获得给定整数的String.valueOf(doubleDigit) 表示,然后使用 Commons StringUtils(在我看来是最简单的)来操作字符串。

      如果您需要在该点返回另一个数值(与新创建/操作的字符串相反),您可以执行 Integer.valueOf(yourString) 或类似的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-10
        相关资源
        最近更新 更多