2

10 進数を 2 進数に変換し、先頭ノードが最上位ビットで最後のノードが最下位ビットであるリンク リストにビットを格納する必要があるという問題があります。10 進数が 0 になるまで、モジュロ 2 を再帰的に取り続け、結果をリストに追加するだけでよいため、問題自体を解決するのは実際には簡単です。

私が立ち往生しているのは、最上位ビットと最後の有効ビットのペア (配列またはリスト) を返すように関数を作成する必要があることです。つまり、関数に 14 を入力すると、(1, 0) が返されます。これは、14 が 2 進数で 1110 であるためです。

MSB と LSB に簡単にアクセスできます (getFirst()、getLast())。

この関数は、10 進数である引数を 1 つだけ取ることができます。

現在、私はこの現在のコードを持っています:

public static void encodeBin(int n) {
    if(n == 0) return; //Base case
    else {
        if(n % 2 == 0)
            theList.addFirst(0);
        else
            theList.addFirst(1);
        encodeBin(n / 2);
    }
    // return?
}

問題は、2 つの値を返す方法がわからないことです。戻り値があるということは、encodeBin() を単独で呼び出すことができないということです。

また、リストはどこに作成すればよいですか?関数の最初に次のようなものを配置するとList<Integer> = new LinkedList<Integer>()、関数がそれ自体を呼び出すたびに、新しいリストが作成され、元のリストではなくその新しいリストにビットが追加されますか?(関数が呼び出されたときに作成されたリストは、初めて)

誰でもこれを解決する方法を知っていますか?

4

3 に答える 3

0

2 つのメソッドを宣言することをお勧めします。

(1) public static int[] encodeBin(int n) および (2) private static void encodeBin(LinkedList, int n)

public メソッドは単に空のリストを作成し、空のリストと元の入力 n の両方をパラメーターとして渡すプライベート バージョンを呼び出します。

このようなもの:

public static int[] encodeBin(int n) {
  LinkedList<Integer> aList = new LinkedList<Integer>();
  encodeBin(aList , n);
  int MSB = aList.getFirst();
  int LSB = aList.getLast();

  return new int[] {MSB, LSB};
}

private static void encodeBin(LinkedList<Integer> list, n) {
  //your recursive version here
}
于 2012-10-25T19:45:50.103 に答える
0

2 つの値を別々に返すことはできません。ただし、最初のビットと最後のビットを含む配列を返す、独自のクラスを作成してこのデータを保持し、そのクラスのインスタンスを返すことができます。


リストについては、次の 2 つのオプションがあります。

  1. staticクラス変数にする
  2. それを関数の引数にします(これはできないと言っていましたが)。

最初の方法は次のようになります。

public class MyClass {
    private static List<Integer> theList = new LinkedList<Integer>();

    // `encodeBin` method as you have it
}

2 番目の方法は次のようになります。

public static void encodeBin(int n, List<Integer> theList) {
    if(n == 0) return; //Base case
    else {
        if(n % 2 == 0)
            theList.addFirst(0);
        else
            theList.addFirst(1);
        encodeBin(n / 2, theList);
    }
}

次に、次の行に沿って何かを行うことができます

List<Integer> theList = new LinkedList<Integer>();
encodeBin(14, theList);

必要にtheList応じて適切なビットを保持します。


注意として、これを整数の代わりにブール値のリストにすることを検討てください。true1false0

于 2012-10-25T19:08:16.360 に答える
0

2 つの値を返すことはできません。2 つの値を含むオブジェクトを返す必要があります。宿題の要件とこの関数が使用される場所に応じて、配列または新しいオブジェクトのいずれかです。

リンクリストの作成に必要なのは、再帰的なヘルパー メソッドです。public メソッドは、オブジェクトを初期化し、再帰を開始し、結果を返すために使用されます。これにより、実際の再帰関数が複数の引数を持つことができます。

public static SOME_TYPE encodeBin(int n) {
  LinkedList result = new LinkedList();
  encodeBin_helper(result,n);
  // return the MSB and LSB
}

public static void encodeBin_helper(LinkedList theList, int n) {
  if(n == 0) return; //Base case
  else {
    if(n % 2 == 0)
        theList.addFirst(0);
    else
        theList.addFirst(1);
    encodeBin_helper(theList, n/2);
  }

}
于 2012-10-25T19:14:33.960 に答える