2012-04-05 89 views
0

我想簡單地用遞歸轉換爲二進制。我在回覆聲明中遇到問題。這編譯但運行時發生溢出錯誤。我不知道該返回什麼(或者如果我的陳述是錯誤的)以防止這個錯誤。使用遞歸轉換十進制到二進制Java

謝謝!

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

    return convertToBinary((number)); 
} 
+2

這是功課? (假設是這樣),請標記爲這樣。 – 2012-04-05 18:04:44

+0

您需要一個基本案例。這只是永遠運行(或者,嘗試,直到它遇到溢出)。 – trutheality 2012-04-05 18:06:23

+0

@trutheality無論是否有基本情況,最後一行都使用相同的參數調用自己,所以下一層沒有任何變化。 – Izkata 2012-04-05 18:09:57

回答

1

一旦number達到零,該方法可以簡單的叫自己一遍又一遍。最後的return需要返回其他內容 - 比如字符串。話雖如此,我不認爲這種方法是非常理想的。

+0

更糟糕的是,無論'number'的值是多少,它都會一遍又一遍地調用它自己。 – Jesper 2012-04-05 18:09:58

2

假設這是功課,我會指出主要的錯誤..

return convertToBinary((number)); 

返回應返回一個值,而不是調用一個函數。這隻會增加一個遞歸狀態棧,導致你的溢出。嘗試將先前調用的值保存到變量中並返回。

3

那麼,問題似乎是你實際上沒有在你的遞歸方法中做任何事情。

在其最基本的形式的遞歸方法應該包含:

  1. 一個或多個逃逸的條件。
  2. 遞歸調用自己。

(這是一個過於簡單化的看法,但它會爲現在要做的。)

的問題是,你錯過了一些逃生的條件來處理參數的情況下是一個有點長,那是當你不能再細分它。

你的代碼的另一個問題是你沒有對遞歸調用的結果做任何事情。你應該存儲和連接它們。

我建議你重新開始:編寫一個方法,首先轉換一個位(這將是非遞歸的),然後將遞歸添加到它。 (一般建議:不要害怕扔掉代碼並重新開始。)

4

您的問題是在數字/ 2和數字%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 2012-04-05 18:10:54

-1

我試圖創建一個通用子程序,它將任何十進制整數&轉換爲所需的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

這裏沒有十進制整數。 – EJP 2017-02-14 22:48:42

-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

您能否在答案中提供更多有關代碼中發生的問題的信息以回答問題。 – 2016-06-08 13:56:07

-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

歡迎來到StackOverflow Julian。你能否爲了可讀性而細化你的代碼片段?另外,請提供一些描述性的背景,至於爲什麼你認爲這是對問題的解決方案。有關幫助,請參閱StackOverflow上的[如何編寫一個合適的答案](http://stackoverflow.com/help/how-to-answer)。 – jacefarm 2016-11-26 05:04:58

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()'已將小數轉換爲二進制。其餘的只是浪費時間。然而,由於認識到輸入不能是'int',迄今爲止唯一的答案是功勞。 – EJP 2017-02-14 22:48:16

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

下面將遞歸工作。如果數字是負數,它將添加「 - 」作爲前綴結果。

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