【问题标题】:A Recursion method that returns number of digits, help for 0返回位数的递归方法,帮助为 0
【发布时间】:2016-09-29 01:14:51
【问题描述】:

所以我正在做这个练习,我的老师说他想要方法中的这一行中的 num/10:System.out.print(numDigits(num/10));(这样如果原始数字是 0,那么它将返回 1 位而不是 0) ,但我不知道他想要哪里。

(*必须用递归来计算数字的位数)

对我来说,这种方式很简单,但我想如果你写了很多代码,你不想继续输入 x/10。

import java.util.*;

public class NumDigits
{
  public static void main(String[]args)
  {
    int num;

    Scanner input = new Scanner(System.in);
    num = input.nextInt();
    input.close();

    System.out.print(numDigits(num/10));
  }

  public static int numDigits(int x)
  {  
    if (x == 0)
    {return 1;}
    else
    {
      return 1 + numDigits(x/10);
    }
  }
}

我想我可以做到这一点,但它需要更多的代码......:/

import java.util.*;

public class NumDigits
{
  public static void main(String[]args)
  {
    int num;

    Scanner input = new Scanner(System.in);
    num = input.nextInt();
    input.close();

    System.out.print(numDigits(num, num));
  }

  public static int numDigits(int x, int num)
  {  
    if (num == 0)
    {return 1;}
    else if (x == 0)
    {return 0;}
    else
    {
      return 1 + numDigits(x/10, num);
    }
  }
}

【问题讨论】:

  • 你能澄清你在问什么吗?
  • 一个很好的单元测试代码,一些0、1、15、20、100等的测试可能会帮助你设计一个好的算法。提示Math.log 可能会提供一个聪明的方法;)
  • 我告诉我的老师,用 num/10 调用方法而不是在方法中添加更多代码更简单(这样 0 就不会有 0 位),但他说“你是对的在那里,主要方法中没有 num/10,而是在递归方法中"

标签: java recursion


【解决方案1】:

我假设 numDigits 返回数字中的小数位数

这是一个简单的解决方案:

public static int numDigits(int x) {
    return Integer.toString(x).length();
}

担心语言环境/基数/速度/负数?试试这个:

public static int numDigits(int x) {
    if (x == 0) {
        return 1;
    } else {
        return (int) (Math.log10(Math.abs(x))) + 1;
    }
}

但是,如果需要递归:

public static int numDigits(int x) {
    if (x > -10 && x < 10) {
        return 1;
    } else {
        return numDigits(x / 10) + 1;
    }
}

【讨论】:

  • 天哪,我不得不承认你的回答先生..太棒了。如此简单和优雅
【解决方案2】:

嗯,第一个除法很容易删除。

public class NumDigits
{
  public static void main(String[]args)
  {
    int num;

    Scanner input = new Scanner(System.in);
    num = input.nextInt();
    input.close();

    System.out.print(numDigits(num));
  }

现在您对 0 的检查仍然可以在 numDigits 函数中使用,而且它对第一个 '0' 的检查也更有效。你现在唯一需要调整的是递归调用本身,作为练习,因为它仍然是家庭作业。

【讨论】:

  • 我知道,这就是问题所在。我不知道用 numDigits 方法做什么
  • 从基本答案开始:如果允许负数,则取您的号码的绝对值。那么,如果它小于 10,你知道答案对吗?如果它大于 10,例如123,你可以做你的/10把戏。
【解决方案3】:

使用递归方法可以通过这种方式实现SuperDigit

public class SuperDigit
{
 //static int sum = 0;

public static void main(String[] args)
{
int n = 8596854;



System.out.println(sum(n));
}
static int sum (int num)
{
if (num != 0)
{
    return (num % 10 + sum (num / 10));
}
else
{
   return 0;
}
}
}

【讨论】:

    【解决方案4】:

    我是个白痴。答案是:

    import java.util.*;
    
    public class NumDigits
    {
      public static void main(String[]args)
      {
        long num;
    
        Scanner input = new Scanner(System.in);
        num = input.nextInt();
        input.close();
    
        System.out.print(numDigits(num));
      }
    
      public static long numDigits(long x)
      {  
        if (x/10 == 0)
        {return 1;}
        else
        {
          return 1 + numDigits(x/10);
        }
      }
    }
    

    我认为它不会起作用,所以我没有尝试它

    【讨论】:

      【解决方案5】:

      你为什么不这样做:

      import java.util.*;
      
      public class NumDigits
      {
      public static void main(String[]args)
      {
      int num;
      
      Scanner input = new Scanner(System.in);
      num = input.nextInt();
      input.close();
      
      System.out.print(numDigits(num));
      }
      
      public static int numDigits(int num)
      {  
      if ((num/10) == 0)
      {return 1;}
      else
      {
        return 1 + numDigits(num/10);
      }
      }
      }
      

      这样“num/10”在递归方法中而不是main方法中,解决了零问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 2011-08-29
        • 2014-02-28
        • 1970-01-01
        • 2018-10-10
        • 1970-01-01
        • 2011-05-05
        相关资源
        最近更新 更多