いくつかの数字を使って可能なすべての数字を生成する方法
-
21-12-2019 - |
質問
私は、そのベクトルに何回も発生したくない数字のベクトルから始めて、可能なすべての数字を生成しようとしています。 私の最初のアイデアはバックトラッキングでしたが、どうやって.... 例えば: 3 7 5=> 3 5 7 35 37 53 57 73 75 357 375 537 573 735 753
解決
基本的には、その番号をその数に追加したベクトルから各数を選択し、再帰呼び出しの縮小ベクトルと「プレフィックス」として使用することができます。その結果、ダブルサイトの後にフィルタリングします アレイ内の固有値
function selectOne(data,res,prependNumber){
var current,reduced,i,len;
for(i=0,len = data.length;i<len;i++){
current = data[i];
if(prependNumber!==false){
current = prependNumber+ '' + current;
}
reduced = data.slice(0);
reduced.splice(i,1);
res.push(parseInt(current));
selectOne(reduced,res,current);
}
}
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
.
サンプルコール
var test = [3,5,7];
var res = [];
selectOne(test,res,false);
console.log(res.filter( onlyUnique ));
.
AlgoryThmは以下の作業を行います。
- 入力アレイを降りて降りて
- この反復の要素によって縮小された新しい配列を生成する
- 私は実際の入力配列を複製するために.slice(0)を使用して、実際の入力配列を複製します。スライスは、指定された索引 で始まる新しい配列を生成します。
- Position i で始まる1要素を抽出するために.SPLICEを使用します。
- 結果を結果を押す
- 縮小配列を使用して関数をもう一度呼び出して、この反復の現在の番号を使用して、次の番号をドラッグして結果 にプッシュします。
e.g。 入力配列[3,5,7]を取ります。私はそれを反復します。まず、3をつかみ、縮小アレイ[5,7]を生成します。私は結果から結果を押して、この配列をこの配列で再帰的に呼び出します。ループで最初に5を選択しますが、PREPONTNUMBERを指定したため、PREPONDNUMBERが結果にプッシュしないが、35を超え、配列が縮小されています[7]。など。
再帰が行われます:
selectOne - level 1
res: [3]
selectOne - level 2
res: [3,35]
selectOne - level 3
res: [3,35,357]
selectOne - level 2
res: [3,35,357,37]
selectOne - level 3
res: [3,35,357,37,375]
selectOne - level 1
res: [3,35,357,37,375,5]
selectOne - level 2
res: [3,35,357,37,375,53]
selectOne - level 3
res: [3,35,357,37,375,53,537]
selectOne - level 2
res: [3,35,357,37,375,53,537,57]
selectOne - level 3
res: [3,35,357,37,375,53,537,57,573]
.
.
.
.所属していません StackOverflow