2

こんにちは、私はプログラミングが初めてで、このフォーラムに登録しています:)

そこで、ネストされた for ループを使用して、0 から 5 までの値を持つ 5 つの数値のすべての組み合わせを出力する小さなプログラムを作成しました。ネストされた for ループを使用すると、これは正常に機能します。しかし、よりクリーンなソリューションはありませんか?forループ自体を呼び出して試してみましたが、私の脳は解決策を得られません.. :(

//my ugly solution
int store1, store2, store3, store4, store5;
        for (int count = 0; count <= 5; count++) {
            store1 = count;
            for (int count2 = 0; count2 <= 5; count2++) {
                store2 = count2;
                for (int count3 = 0; count3 <= 5; count3++) {
                    store3 = count3;
                    for (int count4 = 0; count4 <= 5; count4++) {
                        store4 = count4;
                        System.out
                                .println(store1 + " " + store2 + " " + store4);
                }
 //I'm trying around with something like this 
    void method1() {
        for (int count = 0; count <= 5; count++) {
                    list.get(0).value = count;
            count++;
            method2();
        }
    }
    void method2() {
        for (int count = 0; count <= 5; count++) {
                    list.get(1).value = count;
            count++;
            method1();
        }
    }
4

5 に答える 5

3

通常、人々が再帰や関数を使用しようとする場合、ループを使用する方が簡単または高速です。ただし、この場合、再帰はループと組み合わせたより単純なオプションです。

public static void method(List<Integer> list, int n, int m) {
   if (n < 0) {
       process(list);
   } else {
      for(int i = 0; i < m; i++) {
         list.set(n, i);
         method(list, n-1, m);
      }
   }
}
于 2012-12-13T17:42:42.437 に答える
2

組み合わせを試していることは知っていますが、これが役立つ場合があります。

繰り返しによる順列

n 個の選択肢がある場合、毎回 n 個の選択肢があります。

それらの r を選択すると、順列は次のようになります。

n × n × ... (r 回) = n^r

//when n and r are known statically

class Permutation
{
    public static void main(String[] args)
    {
        char[] values = {'a', 'b', 'c', 'd'};
        int n = values.length;
        int r = 2; 

        int i = 0, j = 0;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                System.out.println(values[j] + " " + values[i]);
            }
        }
    }
}


//when n and r are known only dynamically

class Permutation
{
    public static void main(String[] args)
    {
        char[] values = {'a', 'b', 'c', 'd'};
        int n = values.length;
        int r = 2; 
        int i[] = new int[r];
        int rc = 0;
        for(int j=0; j<Math.pow(n,r); j++)
        {

            rc=0;
            while(rc<r)
            {
                System.out.print(values[i[rc]] + " ");
                rc++;
            }
            System.out.println();
            rc = 0;
            while(rc<r)
            {
                if(i[rc]<n-1)
                {
                    i[rc]++;
                    break;
                }
                else
                {
                    i[rc]=0;
                }
                rc++;
            }
        }
    }
}
于 2012-12-13T18:04:54.020 に答える
0

ここに別のインタラクティブだがエレガントではないバージョン

while (store1 < 6) {
        store5++;
        if (store5 == 6) {
            store5 = 0;
            store4++;
        }
        if (store4 == 6) {
            store4 = 0;
            store3++;
        }
        if (store3 == 6) {
            store3 = 0;
            store2++;
        }
        if (store2 == 6) {
            store2 = 0;
            store1++;
        }
        System.out.println(store1 + " " + store2 + " " + store3 + " " + store4 + " " + store5 + " ");
    }
于 2012-12-13T17:46:32.487 に答える
0

私が考えることができる最も単純なコードは、まったく異なるアプローチで問題に取り組むでしょう:

public class TestA {
    public static void main(String[] argv) {
        for (int i=0; i<(6 * 6 * 6 * 6 * 6); ++i) {
            String permutation = Integer.toString(i, 6);
            System.out.println("00000".substring(permutation.length()) + permutation);
        }
    }
}

あなたのテキスト (あなたのコードではありません) から、5 つの場所と 6 つの記号があることがわかりました。これは、6 から 5 乗の組み合わせがあることを示唆しています。したがって、コードはこれらの数値をカウントし、その数値を出力の組み合わせに変換します。

これは基数 6 の数値システムと見なすこともできるため、このためにフォーマット コード (先頭のゼロを除く) が既にある Integer.toString を使用します。欠落している場合は先行ゼロが追加されます。

于 2012-12-13T18:00:24.203 に答える
0

このようなもの?

// Print all sequences of len(list)+n numbers that start w/ the sequence in list
void method( list, n ) {
    if ( list.length == n )
        // print list
    else for ( int c=0; c<=5; c++ ) {
        // add c to end of list
        method( list, n );
        // remove c from end of list
    }
}

最初の呼び出しはmethod( list, 5 )list最初は空です。

于 2012-12-13T17:41:37.837 に答える