我试图生成所有可能的数字,从一个数字向量开始,我不想发生多于它们在该向量中的次数。 我的第一个想法是回溯但是...... 例如: 3 7 5 => 3 5 7 35 37 53 57 73 75 357 375 537 573 735 753
答案 0 :(得分:2)
基本上我会使用一个递归函数,从向量中选择每个数字,将该数字附加到结果,并在递归调用中使用简化向量和数字作为“前缀”。结果我会在之后过滤为共和党人 具有Unique values in an array
等独特功能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的作品如下。
E.g。 取输入数组[3,5,7]。我迭代它。首先我抓住3并生成缩小的数组[5,7]。我将3推送到结果并使用此数组递归调用我的函数,并将3作为prependNumber。在循环中我然后首先选择5,但因为我已经给出了prependNumber,所以我不会将5推到结果但是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]
.
.
.