Цикл с произвольным количеством вложенности
По теме из базы знаний
- Вычисление произвольного факториала
- Карта ресурсов для производства с использованием полуфабрикатов. КА 2
- Иерархия справочника Сверху Вниз. Получаем произвольное количество родителей "верхнего" уровня
- Собираем образ виртуальной машины с PostgreSQL и платформой 1С. Цикл "Многопоточный CI для 1С c Packer, Vagrant и Jenkins", часть 2
- Пайплайны Jenkins - программирование и настройка. Загружаемые модули. Цикл "Многопоточный CI для 1С", часть 5
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пока сложно представить данное решение, а вы можете получить количество вложенности? И что такой цикл должен делать
(8) Количество вложений обычно определяются количеством оперативной памяти. Кстати как в 1С справляются с этой задачей, когда памяти, которую выдела ОС не хватает. Может существует некий менеджер памяти (например по аналогии с Дельфи) и как он работает и как им управлять?
(8) Можешь в качестве стека использовать массив структур параметров, которые будешь туда класть/доставать по LIFO для эмуляции рекурсии на цикле.
По производительности ты не выиграешь, вернее - потеряешь, но перенесешь эксплуатацию стека из стековой памяти (которая может переполниться при рекурсии) в "кучу", которую переполнить сложнее.
Но если ты упираешься в переполнение стека, то как уже говорили, к твоему коду возникают вопросы. Возможно, его можно реализовать оптимальнее либо вообще решать задачу другим образом.
Если у тебя получится переписать свою рекурсивную функцию на хвостовую рекурсию (где результат возвращается рекурсивно в самом конце - т.е. когда последний рекурсивный вызов возвращает конечный результат) - то это переписывается на циклы вообще без разбухания стека. Все функциональное программирование на этом стоит.
По производительности ты не выиграешь, вернее - потеряешь, но перенесешь эксплуатацию стека из стековой памяти (которая может переполниться при рекурсии) в "кучу", которую переполнить сложнее.
Но если ты упираешься в переполнение стека, то как уже говорили, к твоему коду возникают вопросы. Возможно, его можно реализовать оптимальнее либо вообще решать задачу другим образом.
Если у тебя получится переписать свою рекурсивную функцию на хвостовую рекурсию (где результат возвращается рекурсивно в самом конце - т.е. когда последний рекурсивный вызов возвращает конечный результат) - то это переписывается на циклы вообще без разбухания стека. Все функциональное программирование на этом стоит.
А если с метками и командой (Перейти)? создать список итераторов и пределов цикла.
Возможно может получиться. Только самому придется контролировать с какими параметрами цикл запускать.
А в чем задача заключается, что так много вложенных циклов?
Возможно может получиться. Только самому придется контролировать с какими параметрами цикл запускать.
А в чем задача заключается, что так много вложенных циклов?
Если виток цикла идентифицируется набором параметров, то можно использовать массив, элементами которого будет структура таких параметров. В коде будет только один цикл и он будет выполняться пока не закончится массив параметров, одновременно достраивая этот массив.
Такой приём, например, можно использовать в функции заливки цветом области точечного рисунка. Изначально массив параметров для этой задачи - координаты точки, из которой начинается заливка. На первом витке цикла обходим 4 соседние пикселя и если они не закрашены, добавляем их координаты в массив параметров, и так далее.
Такой приём, например, можно использовать в функции заливки цветом области точечного рисунка. Изначально массив параметров для этой задачи - координаты точки, из которой начинается заливка. На первом витке цикла обходим 4 соседние пикселя и если они не закрашены, добавляем их координаты в массив параметров, и так далее.
Если рекурсию 1С не выдерживает, значит, у вас проблема в исходных данных. После переделки на цикл программа станет жестко зависать, теперь уже не вылетая, а "зацикливаясь".
Но вообще такие вопросы лучше задавать, приводя исходную задачу, не заставляя желающих помочь гадать на кофейной гуще.
Но вообще такие вопросы лучше задавать, приводя исходную задачу, не заставляя желающих помочь гадать на кофейной гуще.
Цикл и рекурсия - это два способа циклического выполнения кода. Любой рекурсивный код можно переделать на явные циклы.
Рекурсия удобна как компактная запись циклов с возвратом к состоянию предыдущей итерации (эксплуатируется неявное использование стека). На явных циклах это реализуется через явное использование стека.
ЗЫ. Хвостовую рекурсию (как самую простую) ряд компиляторов заменяет на циклы автоматически в целях оптимизации.
Рекурсия удобна как компактная запись циклов с возвратом к состоянию предыдущей итерации (эксплуатируется неявное использование стека). На явных циклах это реализуется через явное использование стека.
ЗЫ. Хвостовую рекурсию (как самую простую) ряд компиляторов заменяет на циклы автоматически в целях оптимизации.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот