【问题标题】:Convert Decimal to Binary using Recursion Java使用递归 Java 将十进制转换为二进制
【发布时间】:2012-04-19 11:41:42
【问题描述】:

我正在尝试通过递归简单地转换为二进制。我在返回语句时遇到问题。这可以编译,但在运行时会出现溢出错误。我不知道要返回什么(或者我的陈述是否错误)来防止此错误。

谢谢!

public static String convertToBinary(int number)
{
  if(number > 0)
    {
      convertToBinary(number / 2);
      convertToBinary((number % 2 ));
     }

   return convertToBinary((number));
}

【问题讨论】:

  • 这是作业吗? (假设是)请这样标记它。
  • 您需要一个基本案例。这只是永远运行(或者,尝试直到它遇到溢出)。
  • @trutheality 不管有没有基本情况,最后一行都用相同的参数调用自己,所以在下一层没有任何变化。
  • @Izkata 那也是。现在它甚至没有到达那里。
  • 你已经有了二进制文件。 int number 已经是二进制的。你的问题没有意义。

标签: java recursion binary decimal


【解决方案1】:

我相信你的问题是在 number/2 和 number%2 上调用 convertToBinary。这段代码对我来说很好用,与你的代码没有什么不同:

import java.util.Scanner;

public class DecToBin {

public static void main(String[] args) {

    int input;
    Scanner scan = new Scanner(System.in);

    System.out.print("Enter number to convert to binary: ");
    input = scan.nextInt();
    convert(input);

}

public static void convert(int num) {
    if (num>0) {
        convert(num/2);
        System.out.print(num%2 + " ");
    }
}

}

【讨论】:

  • 虽然这段代码是递归的,但它可能不是所需要的,假设这确实是一个家庭作业。
【解决方案2】:

嗯,问题似乎是你实际上并没有在你的递归方法中做任何事情。

递归方法的最基本形式应该包含:

  1. 一种或多种转义条件。
  2. 递归调用自身。

(这是一个过于简单的观点,但现在可以了。)

问题是您缺少一些转义条件来处理参数为一位长的情况,即您无法再细分它。

您的代码的另一个问题是您没有对递归调用的结果做任何事情。您应该存储并连接它们。

我建议你重新开始:先编写一个转换单个位的方法(这将是非递归的),然后将递归添加到它。 (一般建议:不要害怕丢弃代码并从头开始。)

【讨论】:

    【解决方案3】:

    假设这是作业,我会指出主要错误..

    return convertToBinary((number));
    

    return 应该返回一个值,而不是调用函数。这只会添加一个导致溢出的递归状态堆栈。尝试将之前调用的值保存到变量中并返回。

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      一旦number 达到零,该方法将简单地一遍又一遍地调用自身。最后的return 需要返回其他东西——比如字符串。话虽如此,我认为这种方法并不是非常理想的。

      【讨论】:

      • 更糟糕的是,无论number 的值是多少,它总是一遍又一遍地调用自己。
      【解决方案6】:

      试试下面 -:

      public static String dec2Bin(int num) {
          String result = ((num % 2 == 0) ? "0" : "1"); // expr
      
          if (abs(num) > 1) {
              result = dec2Bin(num / 2) + result;
          }
      
          return result;
      }
      

      【讨论】:

        【解决方案7】:

        这可行,但您必须从头开始打印

        static void printBinary(int x){
             if(x==0)System.out.printf("%3d", x);
              else{
                   System.out.printf("%3d",x%2);
                   printBinary(x/2);
              }
        }
        

        【讨论】:

          【解决方案8】:

          以下将递归工作。如果数字为负数,它将添加“-”作为结果的前缀。

              void printBinary (int n) {
                      if (n < 0) {         //base case
                          System.out.print("-");
                          printBinary(-n);
                      } else if (n < 2) {    //base case
                          System.out.print(n);
                          return;
                      } else {
                          printBinary(n/2);   //recursive step
                          int answer = n%2;   
                          System.out.print(answer);
                      }
          
                  }
          

          【讨论】:

            【解决方案9】:
            class DecBin {
                static int convert(int i) {
                    if (i > 0) {
                        convert (i/2);
                        System.out.println(i%2);
                        return 0;
                    } else {
                        return 0;
                    }
                 }
            
                public static void main(String[]  args) {
                    DecBin.convert(10);
                }
            }
            

            【讨论】:

              【解决方案10】:

              我尝试创建一个通用子例程,它接受任何十进制整数并将其转换为所需的 BASE。

              private Integer convertToBaseN(int num,int n, int pow)
              {
                  Integer r = num%n;
              
                  if(num < n)
                      return new Double((Math.pow(10, pow-1))*r.doubleValue()).intValue();
              
                  return convertToBaseN(num/n, n,pow+1)+ 
                          new Double(Math.pow(10, pow-1)*r.doubleValue()).intValue();
              }
              
                  num :- Decimal No you want to convert.
                  n:- Base to which you want to convert ( n =2 in your case).
                  pow = 1 (fixed);
              
              
                  Input=> convertToBaseN(503,5, 1); Output=> 4003
                  Input=> convertToBaseN(7,2, 1); Output=> 111
              

              注意:- 它不适用于负数。

              【讨论】:

              • 这里没有十进制整数。
              【解决方案11】:

              只需将 (number/2*10) 的二进制转换加上余数即可:

              int binary(int dec) {
                  int remainder=dec%2;
              
                  if (dec==1 || dec==0)
                      return dec;
                  else
                      return remainder + (binary(dec/2)*10);
              }
              

              【讨论】:

                【解决方案12】:
                public class DecImalToBinary {
                    public static String decimalToBinary(int num){
                        StringBuilder sb= new StringBuilder();
                        if (num <2){
                            return ""+ num;
                        }
                        else{
                            return (sb.append(num%2)) + decimalToBinary((num/2));           
                        }
                    }
                
                    public static void main(String[] args){
                        System.out.println(decimalToBinary(8));
                    }
                }
                

                【讨论】:

                • 您能否在回答中提供更多信息,说明回答问题的代码中发生了什么。
                【解决方案13】:
                public String convertirABinario(int n){
                    String b = "";
                    if (n == 0 || n == 1){
                      b = "" + n;
                    }
                    else{
                      b = b + convertirABinario(n/2) + n%2;
                    }
                    return b;
                }
                

                【讨论】:

                • 欢迎来到 StackOverflow Julian。您能否完善您的代码 sn-p 以提高可读性?另外,请提供一些描述性上下文,说明您为什么认为这是该问题的解决方案。如需帮助,请参阅 StackOverflow 上的 How to Write a Good Answer
                【解决方案14】:

                这是我的解决方案:

                 public static String binaerRec(int number)
                {
                    if (number > 1)
                    {
                        return binaerRec(number / 2) + number % 2;
                    } else
                    {
                        return 1 + "";
                    }
                }
                

                玩得开心

                【讨论】:

                • Integer.parseInt() 已经进行了十进制到二进制的转换。其余的只是浪费时间。然而,到目前为止,这是唯一一个承认输入不能是int的答案。
                猜你喜欢
                • 2016-06-27
                • 1970-01-01
                • 2014-07-14
                • 1970-01-01
                • 1970-01-01
                • 2021-07-09
                • 2013-09-23
                • 2017-03-26
                • 2013-01-24
                相关资源
                最近更新 更多