Другие языки программирования и технологии

Вопрос тем, кто хорошо знаком с рекурсией. Язык Си (но это второстепенно)...

Как работать с рекурсивными шагами?
Например, у меня работает функция, и всё в ней меня устраивает, но вот мне потребовалось сохранить эту функцию и
вызвать новую. В определенный момент мне эта функция (в первом рекурсивном шаге) становится не нужной, и соответственно
мне надо вернуться к предыдущей функции, т. е. сделать рекурсивный шаг назад. Это могут быть любые рекурсивные шаги, и в любую сторону, 1->2, 12->11, 1->0.
Проблема в том, что при достижении основного случая, рекурсия завершается. Т. е. мне надо, чтобы функция работала в
любом рекурсивном шаге. Например, у меня функция, я не знаю, продавца. Вот к продавцу приходит покупатель, и хочет купить
товар за 100 рублей (это нулевая функция). Продавец начинает выписывать чек, объяснять как работает товар, покупателю не нравитя цвет, продавец его меняет. Вообщем функция работает.
Но вот приходит покупатель который хочет купить товар за 1000 рублей, соответственно
продавец переключится на более дорогого покупателя (т. е. функция совершает рекурсивный вызов, для того, чтобы начать
работу с новым покупателем, не теряя при этом предыдущего). И так в течении всего рабочего дня, если приходит более дорогой
покупатель, то функция переключается на него (совершает рекурсивный вызов и начинает работать с новым значением). Когда работа с более
дорогим покупателем закончена, функция возвращается к предыдущему (самому дорогому) покупателю. При этом конечный случай (чтобы не допустить бесконечную рекурсию) функции продавца это
не завершение работы с покупателем, а завершение рабочего дня.
Рекурсии в явном виде действительно нет.
Имеется комбинация очереди заданий с приоритетами и прерываниями.

Попробую расшифровать:

Общение продавца и покупателя разбивается на фазы (подзадачи) в соответствии с алгоритмом работы.
Добавляется "фиктивная" фаза с номером 0, которая служит для начала работы.
В начале каждой фазы необходимо добавить проверку на наличие нового покупателя.

Если такой покупатель есть, то необходимо добавить его в очередь обслуживания с признаком "фаза 0".
Если этот новый покупатель с более толстым кошельком, то необходимо для текущего покупателя в очереди зафиксировать его номер фазы и выйти из процесса обслуживания.

Подразумевается, что процесс обслуживания - это функция, которая берет из очереди обслуживания пару (цена, номер фазы) и полностью обрабатывает взаимодействие продавец-покупатель, а потом при завершении удаляет указанную пару из очереди. Эта функция работает в цикле до конца рабочего дня и пока в очереди есть элементы, на каждом шаге цикла вызывается самый "тяжелый" покупатель. В этом же цикле происходит пополнение очереди, аналогичное действиям на фазах (это нужно, чтобы принять 1ого посетителя).

Теперь немного про фазу 0. Она на самом деле не фиктивная. С неё начинается обслуживание, даже если выбрана другая фаза. Она занимается тем, что передаёт управление на запомненную ранее фазу, например через оператор goto. Если каждая фаза сделана независимо от других, то покупатель не заметит, что к нему вернулись через час.

Если независимость устроить не удастся, то необходимо продумать, как в очередь на этапе прерывания обслуживания засунуть контекст, на котором прервался диалог, а потом его восстановить. Контекст фазы - это перечень переменных и их значений, которые нужны для работы на этой фазе, но были установлены на предыдущих фазах.

Примерно так можно скрестить прерывания и процесс обслуживания.
Евгений Березкин
Евгений Березкин
11 112
Лучший ответ
Олег Песков Если позволите, ещё вопрос - почему здесь нет рекурсии? Потому что её нельзя остановить на обратном ходу?
Вообще, возможно ли сделать
рекурсивный шаг 15->14, и продолжить работу в функции которая находится в рекурсивном шаге 14? Это главный вопрос
который меня интересует.
Рекурсия тут ни при чём. У вас очередь с приоритетами.
Д М
Д М
87 531
Влад Карстен Вот прямо то же самое хотел написать, плюсую
Олег Песков Это и ежу понятно. Я вроде бы достаточно подробно объяснил свой вопрос. Можно ли так (как я написал) работать с рекурсией?