たとえば、2つの値のすべての順列を生成したいとします。それぞれが0または1になる可能性があり、次のようになります。
[11,10,01,00]
ここで、最初の変数は最もゆっくりと変化するため、残りの変数が変化する間、固定されたままであることに注意してください。
3つの変数の場合、次のようになります。
[111,110,101,100,011,010,001,000]
再帰的な定義があるはずですが、頭の中で表現できるほど明確ではありません。
たとえば、2つの値のすべての順列を生成したいとします。それぞれが0または1になる可能性があり、次のようになります。
[11,10,01,00]
ここで、最初の変数は最もゆっくりと変化するため、残りの変数が変化する間、固定されたままであることに注意してください。
3つの変数の場合、次のようになります。
[111,110,101,100,011,010,001,000]
再帰的な定義があるはずですが、頭の中で表現できるほど明確ではありません。
これは順列ではなく、組み合わせに関するものであり、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]]
リストのリストのようにパーミュレーションが必要な場合は、リストモナドを使用したソリューションを次に示します。
\n -> mapM (const [0, 1]) [1..n]
(フィードバックに基づいて編集)
最小のn桁の2進整数は000..0(n回)で、これは0です。
最大のn桁の2進整数は111...1(n回)で、2^n-1です。
0
からの整数を生成し、使用1<<n - 1
している値を出力します。
HaskellのIntは、28未満のバイナリ変数に対して安全である必要があります。
お役に立てば幸いです。
ghci> :m +Data.List
ghci> permutations [0,1]
[[0,1],[1,0]]
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]++;
}
}
}