Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переделка вложенных циклов в рекурсию (https://javascript.ru/forum/misc/67490-peredelka-vlozhennykh-ciklov-v-rekursiyu.html)

Pavel Terkin 20.02.2017 17:49

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

Pavel Terkin,
форум решил эту задачу неоднократно ... только как найти? :)

рони 20.02.2017 18:18

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>

Pavel Terkin 20.02.2017 18:38

Спасибо, рони.

Решение Sweet я адоптировал. Но, к сожалению, мало разбираюсь в перебирающих методах. Думал будет проще - судя по задачке факториал на "просторах" :)

рони 20.02.2017 19:59

перебор всех вариантов
 
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>

ynherb 21.02.2017 18:12

Еще 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]] ))

рони 21.02.2017 19:23

ynherb,
исправил ошибку пост № 5 , попробуйте получить тотже результат, пока ваши варианты не отвечают условиям задачи.

ynherb 22.02.2017 00:32

Теперь работает :)
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.