В настоящее время я читаю руководство C++, и сейчас я нахожусь в разделе рекурсии, и я немного смущен тем, как этот процесс работает для этой определенной проблемы. Вот код из примера книги:
void subdivide(char ar[], int low, int high, int level)
{
if (level == 0)
return;
int mid = (high + low)/2;
ar[mid] = '|';
subdivide(ar, low, mid, level - 1); // #1
subdivide(ar, mid, high, level -1); // #2
}
До сих пор я понимаю, что рекурсивный вызов # 1 продолжается до тех пор, пока базовый случай не будет 0, а затем, наконец, произойдет рекурсивный вызов # 2. Однако, когда мы сначала активируем вызов # 2, не будет ли он активировать вызов # 1? Или вызов №1 навсегда перестает работать после того, как он будет выполнен, так что каждый раз, когда мы рекурсируем С# 2, он пропускает # 1 и переходит к вызову # 2?
Первый вызов dosnt перестает работать постоянно. Вызов функции # 1 выполняется снова, каждый раз, когда выполняется вторая (# 2). Также, когда # 1 выполняет, он вызывает вызов # 1 и # 2 и так далее.
Вся функция запускается снова, когда вы рекурсируете, с другим начальным состоянием (аргументы и любые сделанные изменения).
То, что заканчивается, - это "дерево" рекурсивных вызовов - два для уровня уровня, грубо - но рекурсия не идет дальше level
.
"Нарисуйте забор, если это одна доска, покрасьте его сверху вниз. В противном случае разделите ограждение на две слева направо вдоль края доски. Нарисуйте левую половину, затем правую, используя этот алгоритм".
Это описывает на английском языке аналогичную рекурсивную структуру. В вашем случае мы разделим ваш диапазон на две части, разделим маркер разделителя посередине, а затем повторяем каждую половину.
Когда вы возвращаетесь в # 2, вся функция выполняется снова, с новыми значениями аргументов. Это означает, что # 1 не пропускается (если level
равен 0
, и в этом случае функция немедленно возвращается).
void subdivide(char ar[], int &low, int &high, int &level)