我正在尝试从我不想发生的数字的向量开始,生成所有可能的数字,这是它们在该向量中的数量多次。 我的第一个Ideea是回溯,但如何.... 例如: 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)克隆实际的输入阵列,因为切片从给定的索引
    • 开始启动新阵列
    • 我使用.splice以提取1个以I
    • 开始的元素
  3. 将数字推动到结果
  4. 使用缩小的数组再次调用函数并在此迭代中使用当前号码,以预先添加当我拖动下一个数字并将其推送到结果
  5. e.g。 拍摄输入阵列[3,5,7]。我迭代它。首先我抓住3并生成减少的阵列[5,7]。我将3推到结果,并用这个阵列和3作为prependnumber呼叫我的函数。在循环中,我首先选择5,但是因为我已经给出了prependnumber,我没有将5推到结果但是有一个缩小的阵列[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