行列のすべてのバリエーション

ヨルダンゲオルギエフ:

私はJavaScriptで行列のすべての可能なバリエーションを取得するためのアルゴリズムを記述しようとしています。ここで私が達成したいものです。

青、赤、
男性、女性、他の
小、中、大

----------------- 

ブルー、男性、小
青、男性、媒体
ブルー、男性、大きな

ブルー、女性、小さな、
青、女性、媒体、
青、女性、大きい

青、他の、小さな、
青、他の媒体、
青、他の、大きな

赤、男性、小
赤、男性、中
赤、男性、大

赤、女性、小さな、
赤、媒体、女性
赤、女性、大

赤、他の、小さな、
赤、他の媒体、
赤色、他の、大型

これを行うことができますどのように任意のアイデア?

M Oehm:

WHTあなたが欲しいのは、いくつかのリストの直積と呼ばれています。あなたがリストの固定セットを持っている場合は、ネストされたループは、デカルト積を生成するための簡単な方法です。

あなたは、走行距離計のスタイルでリストを反復処理することにより、任意のリストについては、これを一般化することができます。(オドメーターの各桁は、しかし、異なる範囲を有してもよいです。)

ここに方法は次のとおりです。

function cartesian(m) {
    const res = [];
    const index = [];    // current index
    const max = [];      // length of sublists

    for (let i = 0; i < m.length; i++) {
        index.push(0);
        max.push(m[i].length);
    }

    for (;;) {
        res.push(index.map((i, j) => m[j][i]));

        let i = 0;
        index[i]++;

        while (index[i] == max[i]) {
            index[i] = 0;
            i++;

            if (i == m.length) return res;
            index[i]++;
        }
    }
}

このようにそれを呼び出します。

const m = [
    ["blue", "red"],
    ["male", "female", "other"],
    ["small", "medium", "large"],
];

const p = cartesian(m);

これはおそらく理想的ではありませんすべての可能性のうちの1つの巨大なリストを作成します。あなたは結果の配列に現在のリストにプッシュ上記のコード各possibilitiyでやりたいものは何でも実行して機能を変更することができます。上記のコードは、あなたがあなたの記事で示したものの反対で各反復の最初の項目を、変更します。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=376925&siteId=1