Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.02.2017, 17:49
Новичок на форуме
Отправить личное сообщение для Pavel Terkin Посмотреть профиль Найти все сообщения от Pavel Terkin
 
Регистрация: 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.

Заранее спасибо за участие.
Ответить с цитированием
  #2 (permalink)  
Старый 20.02.2017, 18:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Pavel Terkin,
форум решил эту задачу неоднократно ... только как найти?
Ответить с цитированием
  #3 (permalink)  
Старый 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.
Ответить с цитированием
  #4 (permalink)  
Старый 20.02.2017, 18:38
Новичок на форуме
Отправить личное сообщение для Pavel Terkin Посмотреть профиль Найти все сообщения от Pavel Terkin
 
Регистрация: 20.02.2017
Сообщений: 2

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

Решение Sweet я адоптировал. Но, к сожалению, мало разбираюсь в перебирающих методах. Думал будет проще - судя по задачке факториал на "просторах"
Ответить с цитированием
  #5 (permalink)  
Старый 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.
Ответить с цитированием
  #6 (permalink)  
Старый 21.02.2017, 18:12
Интересующийся
Отправить личное сообщение для ynherb Посмотреть профиль Найти все сообщения от ynherb
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 21.02.2017, 19:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

ynherb,
исправил ошибку пост № 5 , попробуйте получить тотже результат, пока ваши варианты не отвечают условиям задачи.
Ответить с цитированием
  #8 (permalink)  
Старый 22.02.2017, 00:32
Интересующийся
Отправить личное сообщение для ynherb Посмотреть профиль Найти все сообщения от ynherb
 
Регистрация: 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()))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск