Pregunta

Estoy tratando de generar todos los números posibles que comienzan con un vector de dígitos que no quiero ocurrir más que cuántas veces están en ese vector. Mi primera ideea fue retrocediendo pero cómo ... Por ejemplo: 3 7 5=> 3 5 7 35 37 53 57 73 75 357 375 537 573 735 753

¿Fue útil?

Solución

Básicamente, usaría una función recursiva que selecciona cada número del vector, agrega ese número al resultado y use un vector reducido y el número que "prefijo" en la llamada recursiva. El resultado que me filtraría después por los Dublicates. con una función única como valores únicos en una matriz

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;
}

Llamada de muestra

var test = [3,5,7];
var res = [];
selectOne(test,res,false);
console.log(res.filter( onlyUnique ));

El algoritmo funciona siguiendo.

  1. Tome la matriz de entrada y paso sobre él
  2. generar una nueva matriz reducida por el elemento en esta iteración
    • Yo uso. CLONE (0) para clonar la matriz de entrada real, porque la rebanada genera una nueva matriz que comienza con el índice dado
    • Yo uso .splice para extraer 1 elemento que comienza en la posición I
  3. empuje el número a otro
  4. Use la matriz reducida para llamar a la función nuevamente y usar el número actual en esta iteración, para preparar que cuando arrastre el siguiente número y presione el resultado
  5. e.g. Tome la matriz de entrada [3,5,7]. Yo iterré sobre ella. Primero tomo 3 y genera la matriz reducida [5,7]. Presiono el 3 al resultado y llamo a mi función recursivamente a esta matriz y 3 como enumerar. En el bucle I luego seleccione primero el 5, pero debido a que le he dado a PrevendNumber, no presione 5 al resultado, pero 35 y tenga una matriz reducida [7]. Y así sucesivamente.

    Se llevará a cabo la siguiente recursión:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top