2016-10-14 21 views
0
java version "1.8.0_92" 

Hiに反復機能を変換します。、再帰

public static String bitConversion(int x) { 
     List<Integer> binaryList = new ArrayList<Integer>(); 

     while(x > 0) { 
      binaryList.add(x % 2); 
      x /= 2; 
     } 

     StringBuilder stringBuilder = new StringBuilder(); 
     for(Integer binary : binaryList) { 
      stringBuilder.append(binary.toString()); 
     } 

     return stringBuilder.toString(); 
    } 

私の試みは、この

public static String bitConversion(int x) { 
     List<Integer> binaryList = new ArrayList<Integer>(); 

     if(x <= 0) { 
      StringBuilder stringBuilder = new StringBuilder(); 
      for(Integer binary : binaryList) { 
       stringBuilder.append(binary.toString()); 
      } 

      return stringBuilder.toString(); 
     } 
     else { 
      binaryList.add(x % 2); 
      return bitConvert(x/2); 
     } 
    } 

ことの一つは、私は整数を追加するbinaryListを持っている必要があることです。すべてが終わった最初の状態で、私はそれらをstringbuilderに入れる必要があります。そして、第2の条件では、それらをリストに追加する必要があります。したがって、リストは両方の条件に対してグローバルである必要があります。しかし、関数がそれ自身を呼び出すと、リストは毎回再初期化されます。

この再帰関数を書く最良の方法についてアドバイスできますか?

ご意見ありがとうございました。

+0

いいえ、再帰的なソリューションでは、リストはまったく必要ありません。 – biziclop

+0

反復解法でもListは必要ありません。最初のループでStringBuilderに直接追加するだけです。 –

答えて

5

基本的に再帰では、2つの部分があります。1)再帰終了条件2)手元にあるタスクを小さな部分に分割し、結果を合成する部分。

public static String bitConversion(int x) { 
    // just simplifying my life here as negative numbers can be represented 
    // in a few ways and usually it's additive code I don't want to deal 
    // with here :) 
    if (x < 0) { 
     throw new IllegalArgumentException("Not implemented for negatives"); 
    } 

    // recursion termination condition for 0 and 1 
    if (x <= 1) { 
     return String.valueOf(x); 
    } 

    // recurision 
    int leastSignificantBit = x % 2; 
    String significantBits = bitConversion(x/2); 
    return significantBits + leastSignificantBit; 
} 
2

再帰終了条件はx == 0であり、空の文字列を返します。 x> 0の場合は、x/2のメソッドを再帰的に呼び出す必要があります。

これは何か?上記のこのような何かについて

public static String bitConversion(int x) { 
    if (x == 0) { 
     return ""; 
    } 
    return (x % 2) + bitConversion(x/2); 
} 
3
public static String bitConversion(int x) { 
    if (x <= 0) return ""; 
    else return x % 2 + bitConversion(x/2); 
} 

方法。悪い点は、StringBuilderを使用しないことです。しかし、あなたはStringBuilderを返す同様のものを実装して、別のメソッドで.toStringで呼び出しをラップすることができます。