2012-04-05 4 views
0

私は単純に再帰でバイナリに変換しようとしています。私はreturn文に問題があります。これはコンパイルされますが、実行時にオーバーフローエラーが発生します。私はこのエラーを防ぐために何を返すべきか(または私の声明が間違っているかどうか)わからない。再帰を使用してDecimalをBinaryに変換するJava

ありがとうございます! numberがゼロに達する

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

    return convertToBinary((number)); 
} 
+2

この宿題ですか? (そうであると仮定して)タグ付けしてください。 –

+0

ベースケースが必要です。これはちょうど永遠に実行されます(または、オーバーフローするまで試行します)。 – trutheality

+0

@truthealityベースケースの有無に関わらず、最終行は同じ引数で呼び出されるため、次のレベルでは何も変わりません。 – Izkata

答えて

1

と、方法は、単に何度もそれ自体の上に呼び出し、あろう。最後のreturnは、文字列のような何かを返す必要があります。そう言えば、私はこのアプローチがひどく最適だとは思わない。

+0

さらに悪いことに、 'number 'の値が何であっても、何度も何度も何度も繰り返し呼び出しています。 – Jesper

2

関数を呼び出していない、値を返す必要があります。これは私が主なエラーを指摘するだろう宿題です

return convertToBinary((number)); 

リターンを仮定。これは、オーバーフローにつながる再帰的な状態スタックを追加するだけです。直前の呼び出しの値を変数に保存して戻してみてください。

3

問題は、あなたが実際に再帰的な方法で何もしていないことが原因と思われます。

  1. つ以上のエスケープ条件を:あなたの再帰的なメソッドが含まれている必要があり、その最も基本的な形で

  2. 自身への再帰呼び出し。

(これは単純化しすぎ図であるが、それは今のところ行います。)

問題は、あなたには、いくつかのエスケープ条件はパラメータは、単一のビット長であることのケースを処理するために不足しているということですあなたがもうそれ以上細分できないときです。

あなたのコードのもう一つの問題は、あなたが再帰呼び出しの結果で何もしていないということです。それらを保存して連結する必要があります。

私はもう一度やり直すことをお勧めします:最初に1ビットを変換するメソッド(これは非再帰型になります)を作成し、それに再帰を追加します。 (一般的なアドバイス:コードを捨てて、最初からやり直すのを恐れないでください。)

4

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 + " "); 
    } 
} 

} 
+0

このコードは再帰的ですが、実際にはこれが宿題だったと仮定すると、おそらく必要なものではありません。 – biziclop

-1

私はDecimal整数&を必要な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 

注意: - 負の数値では機能しません。

+0

ここに10進整数はありません。 – EJP

-1

ちょうど数の残りに(数/ 2 * 10)のバイナリ変換を追加します。

int binary(int dec) { 
    int remainder=dec%2; 

    if (dec==1 || dec==0) 
     return dec; 
    else 
     return remainder + (binary(dec/2)*10); 
} 
-1
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)); 
    } 
} 
+2

質問に答えるためにコード内で何が起こっているかについて、あなたの答えにさらに情報を提供できますか? –

-1
public String convertirABinario(int n){ 
    String b = ""; 
    if (n == 0 || n == 1){ 
     b = "" + n; 
    } 
    else{ 
     b = b + convertirABinario(n/2) + n%2; 
    } 
    return b; 
} 
+4

Juliusへようこそ。読みやすくするためにコードスニペットを洗練してください。また、なぜこれが問題の解決策であると思われるかについて、説明的な文脈を提供してください。ヘルプについては、StackOverflowの[良い答えを書く方法](http://stackoverflow.com/help/how-to-answer)を参照してください。 – jacefarm

0

これは動作しますが、あなたは終わりからそれを印刷する必要があり

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

私の解決策は次のとおりです。

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

楽しい

+1

'Integer.parseInt()'は既に10進数から2進数への変換を行います。残りの部分はちょうど時間の無駄です。しかし、入力が「int」でないことを認識しているこれまでの唯一の答えに関する信用。 – EJP

1

は、以下試してみる - :

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; 
} 
0

再帰的に動作します後。 numberが負の場合、結果に接頭辞として " - "が追加されます。

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); 
      } 

     } 
0
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); 
    } 
} 
関連する問題