Переделка вложенных циклов в рекурсию
Дано: массив массивов из цифр.
Надо вывести число сочетаний из всех массивов. Сделал это вложенными циклами. Проблема в том, что число циклов вариативно, а переделать их в рекурсию не получилось. В примере ниже на входе подается 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, время: 03:10. |