Как генерировать все возможные числа, используя некоторые цифры

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 ));
.

Альгоритм работает следующим.

  1. Возьмите входную массив и найдите его на него
  2. генерировать новый массив, уменьшенный элементом в этой итерации
      .
    • Я использую .SLICE (0), чтобы клонировать фактическую входную массив, потому что ломтик генерирует новый массив, начиная с данного индекса
    • Я использую .splice, чтобы извлечь 1 элемент, начиная с позиции I
  3. Нажмите на номер для результата
  4. Используйте уменьшенный массив, чтобы снова вызвать функцию и использовать текущий номер в этой итерации, для добавления того, что при перетаскивании следующего номера и нажмите, что в результате
  5. e.g. Возьмите входную массив [3,5,7]. Я повторяю это. Сначала я собираюсь 3 и генерирую сниженный массив [5,7]. Я нажимаю 3 к результату и вызваю мою функцию Recurityly с этим массивом и 3 как PrependNumber. В цикле я сначала сначала выбираю 5, но потому что я дал PrefendNumber, я не выдвинул 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]
    .
    .
    .
    
    .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top