いくつかの数字を使って可能なすべての数字を生成する方法

StackOverflow https://stackoverflow.com//questions/23041346

  •  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は以下の作業を行います。

  1. 入力アレイを降りて降りて
  2. この反復の要素によって縮小された新しい配列を生成する
    • 私は実際の入力配列を複製するために.slice(0)を使用して、実際の入力配列を複製します。スライスは、指定された索引
    • で始まる新しい配列を生成します。
    • Position i
    • で始まる1要素を抽出するために.SPLICEを使用します。
  3. 結果を結果を押す
  4. 縮小配列を使用して関数をもう一度呼び出して、この反復の現在の番号を使用して、次の番号をドラッグして結果
  5. にプッシュします。

    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]
    .
    .
    .
    
    .

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top