1

私はJavaの課題に取り組んでいますが、完全に困惑しています。

質問は:

Recursion を使用して次のことを行う関数を作成します。 X 枚の異なるカードがあります。Y 個の封筒しかありません。Y は X 以下です。X と Y の任意の値について、

  1. 順序が重要ではなく、繰り返しが許可されていない場合に、Y エンベロープを埋めることができるすべての可能な方法を表示します。hint: X! / (( X-Y)! * Y!)

  2. 順序が重要であり、繰り返しが許可されている場合に Y エンベロープを満たすことができるすべての可能な方法を表示しますhint: X^Y

  3. 順序が重要で繰り返しが許可されていない場合に、Y エンベロープを埋めることができるすべての可能な方法を表示します。ヒント:X! / (X – Y)!

  4. 順序が重要ではなく、繰り返しが許可されている場合に、Y エンベロープを埋めることができるすべての可能な方法を表示します。ヒント:(X + Y – 1)! / (Y! * (X – 1)!)

たとえば、ケース (1) の場合if X = {J, Q, K, A) and Y = 3、出力は次のようになります。{J,Q,K} {J,Q,A} {J,K,A} {Q,K,A}.

誰にもコードを投稿してほしくありません。また、これを解決してくれる人も探していません! 最初の部分 (質問 a) が完了したら、水門のロックが解除されることを願っています。誰かが疑似コードアルゴリズムを作成する際にいくつかのガイダンスを提供してもらえますか?これは私が得ることができる限りです:

Y の封筒を順番に増加するカードで(ex: X=5, Y=3) {1, 2, 3}. 満たす 最高の封筒を最高のカードと交換し、{1, 2, 5}元の値が見つかるまで減少させます{1, 2, 4}。最高から最低までのすべてのエンベロープに対してこれを行います (番号がまだ使用されていない場合)。{1, 5, 4} {1, 3, 4} {5, 3, 4} {2, 3, 4}.

これは3つの組み合わせが欠落しているため、バラバラになる前に私が得る限りです{1, 5, 3} {3, 4, 5} {5, 3, 2}.

助けていただければ幸いです。これは繰り返し行う課題であるため、解決策は必要ありません。自分で解決策にたどり着くための助けが必要です。ありがとうございました!

編集:概要を説明した3つのソリューションすべてを試しましたが、まだ取得できません。これは私がこれまでに得たものです:

public static void comboNoRep(String[] a, int y, boolean[] used)
{

    if(y == 0) {
        // found a valid solution.
        System.out.println(result);
    }

    for(int i=0; i<a.length; i++) {
        if(!used[i]) {
            used[i] = true;
            result = result + a[i];
            comboNoRep(a, y - 1, used);
            result = result + " ";
            used[i] = false;
        }
        else {
        }
    }

}

誰かが私の欠陥を指摘するのを助けることができますか?

4

4 に答える 4

1

先生は再帰を使ってほしいと言っています。

Y がゼロの場合、与えられた X の答えは何ですか? コードを使用してこれを解決してください。

与えられた X に対して、Y = 任意の乱数 n の解を無料で与えるとしたら、答えは何ですか? n + 1 の解は何ですか? つまり、X = 5, Y = 3 の解が { { ... }, { ... }, ... } であると言った場合、X = 5 の解は簡単にわかりますか? Y = 3 + 1 = 4?

以下は、まったく異なる問題の例です。

最初の前の 2 つのフィボナッチ数が 1 と 1 であることを知っているとしましょう。次の数を見つけるのは簡単ですよね? 前の 2 つが 1 と 2 で、次の 2 つが 3 だとします。前の 2 つが 2 と 3 なら、次は 5 です。

擬似コード:

public int fib(int stop) {
     if (stop < 2) return 1;
     return fibHelp(stop - 2, 1, 1);
}

public int fibHelp(int stop, int oneBelow, int twoBelow) {
   if (stop == 0) return oneBelow;

   return fibHelp(stop - 1, oneBelow + twoBelow, oneBelow);
}

fibHelp がどのように自分自身を呼び出しているかを確認してください。それが再帰です!停止条件 (私の if ステートメント) があることを確認してください。

特定の問題については、 returnvoidではなく、comboNoRepreturn aを使用してSet<Set<Integer>>ください。の場合、 1 つの要素 (空の ) を持つ をy=0返します。、より大きなセット内の各セットに 1 つの要素を追加することによって s の束を構築する a を返します (それが空の場合など)。SetSety=1SetSety=1Set

重複がないことを確認したいのでSet、 and notを使用してください。List

于 2012-11-04T03:06:16.623 に答える
0

問題 1 として、カードの名前card_1card_x. Y エンベロープを満たすすべての可能な方法には、含まれているか含まれcard_1ていないかのいずれかがあることに注意してください。もしそうなら、あなたは問題を Y-1 の封筒に 2 から X までのカードを詰めることに軽減したことになります。そうでない場合は、Y 封筒に 2 から X までのカードを入れることで問題が軽減されます。

うまくいけば、それが過度にならずにあなたを助けるのに十分なヒントになることを願っています. 幸運を!

于 2012-11-04T03:02:15.510 に答える
0

可能なすべてのルートを探索する必要があります。

「解決策」の空のリストを作成する

すべてのカード a について、ソリューションの最初のセットは、各封筒にカードを入れることから始まります - x*y ソリューション

選んだカードごとに: 同じセットのカードから、使用したカードを削除して、解決策が完了したときにカードがなくなるまで繰り返し、それを配列に入れます。

配列を印刷する

于 2012-11-04T02:57:42.373 に答える