Переделка вложенных циклов в рекурсию
Дано: массив массивов из цифр.
Надо вывести число сочетаний из всех массивов. Сделал это вложенными циклами. Проблема в том, что число циклов вариативно, а переделать их в рекурсию не получилось. В примере ниже на входе подается arr = [[1,2,4], [1,2,4]] Получаем: 11 12 14 21 22 24 41 42 44 Код:
Также думал над вариантом создать портотип функции цикла циклов, которая будет модфифицироваться взависимости от входа, но тут знаний вообще не хвататет. И на "просторах" даже не нашел - возможен ли такой путь в JS. Заранее спасибо за участие. |
Pavel Terkin,
форум решил эту задачу неоднократно ... только как найти? :) |
Pavel Terkin,
вариант Sweet, https://javascript.ru/forum/misc/194...tml#post117263
<script>
function combinator(matrix){
return matrix.reduceRight(function(combination, x){
var result = [];
x.forEach(function(a){
combination.forEach(function(b){
result.push( [ a ].concat( b ) );
});
});
return result;
});
};
document.write(
combinator( [[1,2,4], [1,2,4]] ).join("<br>")
);
</script>
|
Спасибо, рони.
Решение Sweet я адоптировал. Но, к сожалению, мало разбираюсь в перебирающих методах. Думал будет проще - судя по задачке факториал на "просторах" :) |
перебор всех вариантов
Pavel Terkin,
<script>
function gn(a) {
if (2 > a.length) return a[0];
for (var d = [], e = a.shift(), f = a.shift(), b = 0; b < e.length; b++)
for (var c = 0; c < f.length; c++) d.push([].concat(e[b],f[c]));
a.unshift(d);
return gn(a)
};
document.write(JSON.stringify(gn( [[1,2,3], [4,5,6],[7,8,9]] )))
</script>
|
Еще 2 варианта
function gn (arr, result = []) {
var [j, mas]= [arr[0].shift(), arr.slice(1).join().split(',')]
for(var i = 0; i < mas.length; i++) result.push(j+','+mas[i]);
return (!arr[0].length) ? result : gn(arr, result);
}
console.log(gn( [[1,2,3], [4,5,6],[7,8,9]] ))
function gn (arr, result = []) {
var [j, mas]= [arr[0].shift(), arr.slice(1)]
for(var i = 0; i < mas.length; i++)
for(var k = 0; k < mas[i].length; k++)
(result[k] == undefined) ? result[k] = j+','+mas[i][k] : result[k] = result[k] + ','+ mas[i][k];
return (!arr[0].length) ? result : result.concat(gn(arr));
}
console.log(gn( [[1,2,3], [4,5,6],[7,8,9]] ))
|
ynherb,
исправил ошибку пост № 5 , попробуйте получить тотже результат, пока ваши варианты не отвечают условиям задачи. |
Теперь работает :)
function fn (arr, result = [], l = 1) {
let [j, mas, index] = [1*l, arr[0], arr[0].length]
arr.forEach(function (e){j *= e.length;})
for(var i = 0; i < j ; i++)
(result[i] == undefined) ? result[i] = [mas[i%index]] : result[i].push(mas[i%index]);
return (arr.length == 1) ? result : fn(arr, result.sort(), l*arr.shift().length);
}
alert(JSON.stringify(fn([[1,2,3], [4,5,6], [7,8,9]]).sort()))
|
| Часовой пояс GMT +3, время: 02:20. |