Алгоритм перебора возможных сочетаний

1. UltraUnion2005 41 12.02.16 21:55 Сейчас в теме
На выходе должен быть массив со списками значений типом товар. (так надо)). В МассивВсех - все товары (Товар1, Товар2, Товар3)

Вот что получилось, не могу понять. где нужно очищать временный список значений. или корректировка алгоритма, помогите пожалуйста :)
	Масс = Новый Массив;
	ЗаполнитьНабор(Масс);

Процедура ЗаполнитьНабор(МассивВозможных, ТекущийНомерСтроки = 0, ТекСтр="")
	СписВрем = Новый СписокЗначений;
	Если ТекущийНомерСтроки = МассивВсех.Количество() Тогда
	         Возврат;
	КонецЕсли;
		
	
Для Сч = ТекущийНомерСтроки По МассивВсех.Количество() - 1 Цикл

        Для Каждого Элемент из СписТекТовар Цикл
	    СписВрем.Добавить(Элемент);
        КонецЦикла;
	СписТекТовар = СписВрем.Скопировать();
	СписТекТовар.Добавить(МассивВсех[Сч].Значение);
	МассивВозможных.Добавить(СписТекТовар);
	
	ЗаполнитьНабор(МассивВозможных, Сч + 1,  СписТекТовар);

КонецЦикла;

КонецПроцедуры
Показать
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1484 12.02.16 23:33 Сейчас в теме
(1) Ultraunion.ru, ильдарович(пользователь форума) такие задачи решает в запросе.
+
3. UltraUnion2005 41 13.02.16 00:27 Сейчас в теме
Да, я видела, но может быть можно решить мои образом? Я еще думала, если вот так сделать? Пока не работает, но ближе к праве,и чувствую, что решение близко....Врем - это список значений
Процедура ЗаполнитьНабор(МассивВозможных, ТекущийНомерСтроки = 0, Врем="")

	Если ТекущийНомерСтроки = МассивВсех.Количество() Тогда
	         Возврат;
		 КонецЕсли;
	Если ТекущийНомерСтроки > 0 Тогда
	
	МассивВозможных.Добавить(Врем);

	КонецЕсли;
	
	
	Для Сч = ТекущийНомерСтроки По МассивВсех.Количество() - 1 Цикл
	СписТекТовар = Врем.Скопировать();
	СписТекТовар.Добавить(МассивВсех[Сч].Значение);
	ЗаполнитьНабор(МассивВозможных, Сч + 1,  СписТекТовар);
КонецЦикла;
	СписТекТовар.Очистить();
КонецПроцедуры
Показать
+
4. UltraUnion2005 41 13.02.16 00:32 Сейчас в теме
(3) Ultraunion.ru,

Вот что выходит из набора (Товар 1, Товар2, Товар3, Товар4, Товар5)
Не совсем то((
Прикрепленные файлы:
+
5. Xershi 1484 13.02.16 01:17 Сейчас в теме
(4) Ultraunion.ru, я так понимаю тебе нужно получить все уникальные комбинации в зависимости от количества элементов. Условно каждый элемент в массиве уникален. Тогда это нужно делать цикл и строить условие, но я думаю это все равно лучше сделать запросом тем более что уже где то есть готовый!
UltraUnion2005; +1
6. UltraUnion2005 41 13.02.16 01:26 Сейчас в теме
Хорошо, я посмотрела у Ильдаровича, слишком там все умно в этом запросе комбинаторе. А мой код маленький и понятный. Жаль, что не рабочий))
Тем более это не совсем то, что мне нужно. Строки я могу скомбинировать (Строка будет - "Товар1Товар2". Но мне надо именно массив списков значений с определленным типом. чтобы в запрос в условие Товар1 В (&Список). И вот если я передаю строку, то ругается. Потому что не понимает тип значения. А если я создам массив со списком значений типом Товар. То все замечательно будет. и запрос подхватит.
Ну либо мне нужно как переделать строку в список значений. Это я тоже искала, не нашла

Подожду, вдруг кто-нибудь сталкивался с таким вопросом :)
+
7. pvvpvv 10 13.02.16 01:54 Сейчас в теме
Надо преобразовать массив в таблицу, передать в запрос, в котором левым соединением соеденить по Ссылка < ССылка
UltraUnion2005; +1
8. pvvpvv 10 13.02.16 02:10 Сейчас в теме
А можно, как в FORTRANE - в цикле, предварительно отсортирова. А можно, как в 1С, взяв За основу первый Элемент, а потом прибавлять, следующий. А можно ....
+
9. pvvpvv 10 13.02.16 02:34 Сейчас в теме
10. UltraUnion2005 41 13.02.16 08:21 Сейчас в теме
(9) pvvpvv, Конечно надо! Доброе утро:)
"А можно, как в 1С, взяв За основу первый Элемент, а потом прибавлять, следующий."
Немного поподробнее можно. Или в каком модуле это посмотреть?
+
11. UltraUnion2005 41 13.02.16 08:23 Сейчас в теме
Или вот "Надо преобразовать массив в таблицу, передать в запрос, в котором левым соединением соединить по Ссылка < ССылка". Пожалуйста, распишите поподробнее. Неужели Колонку с самой собой левым соединением?
+
12. Xershi 1484 13.02.16 10:47 Сейчас в теме
(11) Ultraunion.ru, массив выгрузи в тз и передай в запрос и делов то.
+
13. ildarovich 7861 13.02.16 11:10 Сейчас в теме
(0) Вот функция, решающая эту задачу
Функция ВсеПодмножества(Множество) 
	Ответ = Новый Массив;
	Ответ.Добавить(Новый СписокЗначений);
	Для ИндексЭлемента = 0 По Множество.Количество() - 1 Цикл
		Для ИндексВарианта = 0 По Ответ.Количество() - 1 Цикл
			Ответ.Добавить(Ответ[ИндексВарианта].Скопировать());
			Ответ[ИндексВарианта].Добавить(Множество[ИндексЭлемента])
		КонецЦикла
	КонецЦикла;
	Возврат Ответ
КонецФункции
Показать
Рекурсия здесь уже раскрыта.
undo; odin777; Xershi; +3
14. Xershi 1484 13.02.16 15:48 Сейчас в теме
(13) ildarovich, примерно так себе это и представлял. Пример сами писали?
+
15. UltraUnion2005 41 14.02.16 00:12 Сейчас в теме
(13) ildarovich, Вы мне сами ответили? очень очень приятно!!
Усну довольная и счастливая! Спасибо большое! Это очень ценно, когда опытные профессионалы помогают начинающим:)
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот