Цикл с произвольным количеством вложенности

1. DmitriyV 20.03.19 06:35 Сейчас в теме
Как сделать такой цикл? Если вложенность изначально неизвестна. Только не рекурсией
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. alxarz 31 20.03.19 07:12 Сейчас в теме
(1) так хотя бы верхняя граница вложенности известна? 100,1000,10000?
+
5. DmitriyV 20.03.19 07:28 Сейчас в теме
(3) нет, не известна
+
16. Xershi 1484 20.03.19 13:38 Сейчас в теме
(5) тогда только рекурсия.
+
2. SedovSU@mail.ru 297 20.03.19 06:53 Сейчас в теме
Пока сложно представить данное решение, а вы можете получить количество вложенности? И что такой цикл должен делать
+
4. DmitriyV 20.03.19 07:27 Сейчас в теме
(2)
допустим, пользователь задает вложенность. Цикл перебирает все возможные комбинации
+
10. VladimirB 16 20.03.19 08:32 Сейчас в теме
(4) Так есть же решение задач перебора всех возможных вариантов.
+
11. VladimirB 16 20.03.19 08:33 Сейчас в теме
(10) Допустим задача о перестановках вообще вроде без рекурсии
+
6. minimajack 80 20.03.19 07:59 Сейчас в теме
Пока Условие Цикл

	

КонецЦикла;
+
7. user1180228 20.03.19 08:00 Сейчас в теме
Цикл поместить в функцию, из функции сделать вызов самой себя - тривиальная задача.
+
8. DmitriyV 20.03.19 08:05 Сейчас в теме
(7) это уже рекурсия. При большой вложенности 1с не выдерживает и закрывается
+
13. user1180228 20.03.19 08:56 Сейчас в теме
(8) Количество вложений обычно определяются количеством оперативной памяти. Кстати как в 1С справляются с этой задачей, когда памяти, которую выдела ОС не хватает. Может существует некий менеджер памяти (например по аналогии с Дельфи) и как он работает и как им управлять?
+
17. Xershi 1484 20.03.19 13:39 Сейчас в теме
(8) ставьте ограничений на количество, а также 64 битные клиенты!
+
18. herfis 498 20.03.19 14:15 Сейчас в теме
(8) Можешь в качестве стека использовать массив структур параметров, которые будешь туда класть/доставать по LIFO для эмуляции рекурсии на цикле.
По производительности ты не выиграешь, вернее - потеряешь, но перенесешь эксплуатацию стека из стековой памяти (которая может переполниться при рекурсии) в "кучу", которую переполнить сложнее.
Но если ты упираешься в переполнение стека, то как уже говорили, к твоему коду возникают вопросы. Возможно, его можно реализовать оптимальнее либо вообще решать задачу другим образом.
Если у тебя получится переписать свою рекурсивную функцию на хвостовую рекурсию (где результат возвращается рекурсивно в самом конце - т.е. когда последний рекурсивный вызов возвращает конечный результат) - то это переписывается на циклы вообще без разбухания стека. Все функциональное программирование на этом стоит.
+
9. VladimirB 16 20.03.19 08:29 Сейчас в теме
А если с метками и командой (Перейти)? создать список итераторов и пределов цикла.
Возможно может получиться. Только самому придется контролировать с какими параметрами цикл запускать.
А в чем задача заключается, что так много вложенных циклов?
+
12. SlavaKron 20.03.19 08:38 Сейчас в теме
Если виток цикла идентифицируется набором параметров, то можно использовать массив, элементами которого будет структура таких параметров. В коде будет только один цикл и он будет выполняться пока не закончится массив параметров, одновременно достраивая этот массив.
Такой приём, например, можно использовать в функции заливки цветом области точечного рисунка. Изначально массив параметров для этой задачи - координаты точки, из которой начинается заливка. На первом витке цикла обходим 4 соседние пикселя и если они не закрашены, добавляем их координаты в массив параметров, и так далее.
+
14. ildarovich 7861 20.03.19 13:21 Сейчас в теме
Если рекурсию 1С не выдерживает, значит, у вас проблема в исходных данных. После переделки на цикл программа станет жестко зависать, теперь уже не вылетая, а "зацикливаясь".
Но вообще такие вопросы лучше задавать, приводя исходную задачу, не заставляя желающих помочь гадать на кофейной гуще.
+
15. herfis 498 20.03.19 13:33 Сейчас в теме
Цикл и рекурсия - это два способа циклического выполнения кода. Любой рекурсивный код можно переделать на явные циклы.
Рекурсия удобна как компактная запись циклов с возвратом к состоянию предыдущей итерации (эксплуатируется неявное использование стека). На явных циклах это реализуется через явное использование стека.
ЗЫ. Хвостовую рекурсию (как самую простую) ряд компиляторов заменяет на циклы автоматически в целях оптимизации.
+
19. mrcamomile 80 20.03.19 17:46 Сейчас в теме
Пока Истина Цикл
	
	// код 
	
	Если Условие Тогда
		Прервать;	
	КонецЕсли;
	
КонецЦикла;
Показать
+
Внимание! Тема сдана в архив

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