Как генерировать все возможные числа, используя некоторые цифры
-
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 ));
.
Альгоритм работает следующим.
- Возьмите входную массив и найдите его на него
- генерировать новый массив, уменьшенный элементом в этой итерации
- .
- Я использую .SLICE (0), чтобы клонировать фактическую входную массив, потому что ломтик генерирует новый массив, начиная с данного индекса
- Я использую .splice, чтобы извлечь 1 элемент, начиная с позиции I
- Нажмите на номер для результата
- Используйте уменьшенный массив, чтобы снова вызвать функцию и использовать текущий номер в этой итерации, для добавления того, что при перетаскивании следующего номера и нажмите, что в результате
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]
.
.
.
.