3

たとえば、2つの値のすべての順列を生成したいとします。それぞれが0または1になる可能性があり、次のようになります。

[11,10,01,00]

ここで、最初の変数は最もゆっくりと変化するため、残りの変数が変化する間、固定されたままであることに注意してください。

3つの変数の場合、次のようになります。

[111,110,101,100,011,010,001,000]

再帰的な定義があるはずですが、頭の中で表現できるほど明確ではありません。

4

5 に答える 5

24

これは順列ではなく、組み合わせに関するものであり、Haskellで簡単に生成できます。

replicateM 3 "01"
= ["000","001","010","011","100","101","110","111"]

実際の整数が必要な場合:

replicateM 3 [0, 1]
= [[0,0,0],[0,0,1],[0,1,0],[0,1,1],
   [1,0,0],[1,0,1],[1,1,0],[1,1,1]]

最後に、さまざまな位置の値が異なる場合:

sequence [".x", ".X", "-+"]
= ["..-","..+",".X-",".X+","x.-","x.+","xX-","xX+"]

もちろん、これは整数でも機能します。

sequence [[0,1], [0,2], [0,4]]
= [[0,0,0],[0,0,4],[0,2,0],[0,2,4],
   [1,0,0],[1,0,4],[1,2,0],[1,2,4]]
于 2013-03-17T03:36:31.070 に答える
2

リストのリストのようにパーミュレーションが必要な場合は、リストモナドを使用したソリューションを次に示します。

\n -> mapM (const [0, 1]) [1..n]
于 2013-03-17T03:02:32.137 に答える
1

(フィードバックに基づいて編集)

最小のn桁の2進整数は000..0(n回)で、これは0です。

最大のn桁の2進整数は111...1(n回)で、2^n-1です。

0からの整数を生成し、使用1<<n - 1している値を出力します。

HaskellのIntは、28未満のバイナリ変数に対して安全である必要があります。

お役に立てば幸いです。

于 2013-03-17T03:01:35.800 に答える
1
ghci> :m +Data.List
ghci> permutations [0,1]
[[0,1],[1,0]]
于 2013-03-17T06:49:18.700 に答える
-3

haskelはわかりませんが、順列の実行方法に関する疑似コードのブロックを次に示します。

var positions = [0,0,0];
var max = 1;

done:
while(true){
    positions[0]++; //Increment by one
    for (var i = 0; i < positions.length; i++) {
        if(positions[i] > max){ //If the current position is at max carry over
            positions[i] = 0;
            if(i+1 >= positions.length){ //no more positions left
                break done; 
            }
            positions[i+1]++;
        }
    }
}
于 2013-03-17T03:14:58.597 に答える