0

私は練習問題に取り組んでいて、立ち往生しています。この問題では、2 つの整数 x と y を取り込んで、3 つの移動のいずれかを繰り返し使用して (0,0) から (x,y) までの 2D 平面を移動するためのすべての解を出力するメソッドを作成する必要があります。

  • 右に移動 1 (E)
  • 上に移動 1 (N)
  • 右に 1、上に 1 移動 (NE)

呼び出しの例を次に示します。

  • 呼び出し: 旅行 (2, 1)
  • 出力: EEN // ENE // E NE // NEE // NE E

次のコードを書きました。

public void travel(int x, int y) {
    if (x == 0 && y == 0) {
        System.out.println();
    } else if (x > 0 && y > 0) {
        System.out.print("E ");
        travel(x-1, y);
        System.out.print("N ");
        travel(x, y-1);
        System.out.print("NE ");
        travel(x-1, y-1);
    } else if (x > 0 && y == 0) {
        System.out.print("E ");
        travel(x-1, y);
    } else if (y > 0 && x == 0) {
        System.out.print("N ");
        travel(x, y-1);
    }
}

上記のメソッドを呼び出すと、次のコードが生成されます。

  • 呼び出し: 旅行 (2,1);
  • 出力: EEN // NE // NE // NEE // NE E

この例の呼び出しでは、E が後続の再帰メソッドが呼び出される前に出力されるため、E を必要とする 3 つの異なるケースで E が 1 回しか出力されないことに問題があることがわかっています。

travel メソッドを呼び出すたびに System.out.print コマンドを添付することで、これを修正したいと思います (これが正しいアプローチであるという確証はありません)。そうすれば、travel メソッドが呼び出されるたびに、毎回最初の文字で結果が出力されます。ただし、メソッドは何も返さないため、print ステートメント内にメソッドを挿入することはできません。これは私が長い間立ち往生しているところです。

ここからどのように進むかについてのアドバイスをいただければ幸いです。

4

1 に答える 1

2

ソリューションを再帰的に構築する場合、部分的に構築されたソリューションを引数として再帰呼び出しに渡すのが一般的です。

public void travel(int x, int y, String path) {
    if (x == 0 && y == 0) {
        System.out.println(path);
    } else if (x > 0 && y > 0) {
        travel(x-1, y, path + ' E');
        travel(x, y-1, path + ' N');
        travel(x-1, y-1, path + ' NE');
    } else if (x > 0 && y == 0) {
        travel(x-1, y, path + ' E');
    } else if (y > 0 && x == 0) {
        travel(x, y-1, path + ' N');
    }
}

パスを作成する方法を見てみましょう。関数呼び出しで、検索中の場所を記憶するという複雑な処理を処理できますか? これには、パスごとに 1 つの呼び出ししかないため、コードを簡素化するという優れた特性もありSystem.out.printlnます。

于 2013-06-24T19:24:59.010 に答える