20.02.2017, 17:49
|
Новичок на форуме
|
|
Регистрация: 20.02.2017
Сообщений: 2
|
|
Переделка вложенных циклов в рекурсию
Дано: массив массивов из цифр.
Надо вывести число сочетаний из всех массивов. Сделал это вложенными циклами. Проблема в том, что число циклов вариативно, а переделать их в рекурсию не получилось.
В примере ниже на входе подается arr = [[1,2,4], [1,2,4]]
Получаем: 11 12 14 21 22 24 41 42 44
Код:
|
"use strict";
function getPINs(observed) {
var arr = observed.join('').split('');
var keyVariationObj = {0:[0,8],1:[1,2,4],2:[1,2,3,5],3:[2,3,6],4:[1,4,5,7],5:[2,4,5,6,8],6:[3,5,6,9],7:[4,7,8],8:[0,5,8],9:[6,8,9]};
var temp = '';
var counter = 0;
for (var i=0;i<arr.length;i++) {
arr.splice(i,1,keyVariationObj[arr[i]]);
counter++; // для глубины рекурсии
}
//переделываю этот блок
for (var i=0;i<arr[0].length;i++) {
for (var j=0;j<arr[1].length;j++) {
temp = temp + arr[0][i] + arr[1][j]+' ';
}
}
/*
function fillRezult(counter) {
if (counter>0) {
temp = temp + arr[counter-1].forEach(function(item) {
return item + fillRezult(counter-1) + ' ';
});
return temp;
}
else {return '';}
} */
return temp;
}
console.log (getPINs(["11"]));
|
PS
Также думал над вариантом создать портотип функции цикла циклов, которая будет модфифицироваться взависимости от входа, но тут знаний вообще не хвататет. И на "просторах" даже не нашел - возможен ли такой путь в JS.
Заранее спасибо за участие.
|
|
20.02.2017, 18:04
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Pavel Terkin,
форум решил эту задачу неоднократно ... только как найти?
|
|
20.02.2017, 18:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
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>
Последний раз редактировалось рони, 22.04.2018 в 20:44.
|
|
20.02.2017, 18:38
|
Новичок на форуме
|
|
Регистрация: 20.02.2017
Сообщений: 2
|
|
Спасибо, рони.
Решение Sweet я адоптировал. Но, к сожалению, мало разбираюсь в перебирающих методах. Думал будет проще - судя по задачке факториал на "просторах"
|
|
20.02.2017, 19:59
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
перебор всех вариантов
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>
Последний раз редактировалось рони, 21.02.2017 в 19:19.
|
|
21.02.2017, 18:12
|
Интересующийся
|
|
Регистрация: 21.02.2017
Сообщений: 14
|
|
Еще 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, 21.02.2017 в 18:17.
|
|
21.02.2017, 19:23
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
ynherb,
исправил ошибку пост № 5 , попробуйте получить тотже результат, пока ваши варианты не отвечают условиям задачи.
|
|
22.02.2017, 00:32
|
Интересующийся
|
|
Регистрация: 21.02.2017
Сообщений: 14
|
|
Теперь работает
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()))
|
|
|
|