如何使用某些数字生成所有可能的数字

时间:2014-04-13 10:01:44

标签: recursive-backtracking

我试图生成所有可能的数字,从一个数字向量开始,我不想发生多于它们在该向量中的次数。 我的第一个想法是回溯但是...... 例如: 3 7 5 => 3 5 7 35 37 53 57 73 75 357 375 537 573 735 753

1 个答案:

答案 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的作品如下。

  1. 获取输入数组并跳过它
  2. 生成一个由此迭代中的元素减少的新数组
    • 我使用.slice(0)克隆实际的输入数组,因为slice生成一个以给定索引开头的新数组
    • 我使用.splice从位置i
    • 开始提取1个元素
  3. 将数字推送到结果
  4. 使用简化数组再次调用该函数并使用此迭代中的当前数字,以便在我拖动下一个数字并将其推送到结果时添加该数字
  5. 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]
    .
    .
    .