Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

3.5. Рекурсия 135

Рекурсивное внедрение функции факториала

Давайте рассмотрим C ++ внедрение функции факториала показанный в Кодовом Frag-ment 3.36 под именем recursiveFactorial. Заметьте, что никакое перекручивание не было необходимо здесь. Повторные рекурсивные просьбы функции занимают место перекручивания.

интервал recursiveFactorial (интервал n)

если (n == 0) возвращаются 1;

еще возвратите n * recursiveFactorial (n-1);

//рекурсивная функция факториала / / bas i s аварий e//рекурсивный случай

Кодовый Фрагмент 3.36: рекурсивное внедрение функции факториала.

Мы можем иллюстрировать выполнение рекурсивного определения функции посредством a

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

Каково преимущество использования рекурсии? Хотя рекурсивный implementa-tion функции факториала несколько более прост, чем повторяющаяся версия, в этом случае нет никакого неопровержимого довода предпочтения рекурсии по повторению. Для некоторых проблем, однако, рекурсивное внедрение может быть значительно более простым и легче понять, чем повторяющееся внедрение. Такой пример следует.

Рисунок 3.16: след рекурсии для требования recursiveFactorial (4).

136 Глава 3. Множества, связанные списки и рекурсия

Привлечение английского правителя

Как более сложный пример использования рекурсии, рассмотрите, как потянуть маркировки типичного английского правителя. Такая линейка сломана в интервалы, и каждый интервал состоит из ряда тиканья, размещенного с промежутками в 1/2 дюйма, 1/4 дюйма, и так далее. Поскольку размер интервала уменьшается наполовину, уменьшения продолжительности тиканья одним. (См. рисунок 3.17.)

----0

-----0

---

0

-

-

-

--

--

--

-

-

-

---

---

---

1

-

-

-

--

--

--

-

-

-

----1

----

---

2

-

-

-

--

--

--

-

-

-

---

---

---

3

-

-

--

--

-

-

----2

-----1

(a)

(b)

(c)

Рисунок 3.17: Три типовой продукции английского рисунка правителя: (a) 2-дюймовый правитель с главной продолжительностью тиканья 4; (b) 1-дюймовый правитель с главной продолжительностью тиканья 5; (c) 3-дюймовый правитель с главной продолжительностью тиканья 3.

У каждой доли дюйма также есть числовая этикетка. Самую долгую продолжительность тиканья называют главной продолжительностью тиканья. Мы не будем волноваться о фактических расстояниях, однако, и просто печатать одно тиканье за линию.

Рекурсивный подход к рисунку правителя

Наш подход к привлечению такого правителя состоит из трех функций. Главная функция drawRuler привлекает всего правителя. Его аргументы - общее количество дюймов в правителе, nInches, и главная продолжительность тиканья, majorLength. Сервисный dra-wOneTick функции привлекает единственное тиканье данной длины. Этому можно также дать дополнительную этикетку целого числа, которая напечатана, если это неотрицательно.