Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Пример 2. В этом случае, прежде чем начнут выполняться инструкции

Читайте также:
  1. V. Конкретные примеры миграции животных
  2. Азот; более вероятно образование азота в виде более сложных соединений (например, мочевины)
  3. В Америке и Европе? Нужны примеры.
  4. В качестве примеров он назвал Будду, Магомета, Соломона, Цезаря, Наполеона и др.
  5. Возмутительный пример
  6. Вопрос 27. Приведите примеры анализа анамнестических данных дошк-ов
  7. Ворота Оплаты 4. Пример.
  procedure LoopImitation2(i, n: integer); begin if i<=n then LoopImitation2(i+1, n); writeln('Hello N ', i); end;

В этом случае, прежде чем начнут выполняться инструкции, произойдет рекурсивный вызов процедуры. Новый экземпляр процедуры также, прежде всего, вызовет еще один экземпляр и так далее, пока не дойдем до максимального значения счетчика. Только после этого последняя из вызванных процедур выполнит свои инструкции, затем выполнит свои инструкции предпоследняя и т.д. Результатом вызова LoopImitation2(1, 10) будет печать приветствий в обратном порядке:

Hello N 10

Hello N 1

Если представить себе цепочку из рекурсивно вызванных процедур, то в примере 1 мы проходим ее от раньше вызванных процедур к более поздним. В примере 2 наоборот от более поздних к ранним.

 

Наконец, рекурсивный вызов можно расположить между двумя блоками инструкций. Например:

  procedure LoopImitation3(i, n: integer); begin writeln('Hello N ', i); {Здесь может располагаться первый блок инструкций} if i<=n then LoopImitation3(i+1, n); writeln('Hello N ', i); {Здесь может располагаться второй блок инструкций} end;

Здесь сначала последовательно выполнятся инструкции из первого блока затем в обратном порядке инструкции второго блока. При вызове LoopImitation3(1, 10) получим:

Hello N 1

Hello N 10
Hello N 10

Hello N 1

Потребуется сразу два цикла, чтобы сделать то же самое без рекурсии.[5]

Тем, что выполнение частей одной и той же процедуры разнесено по времени можно воспользоваться. Например:

Пример 3: Перевод числа в двоичную систему.

Получение цифр двоичного числа, как известно, происходит с помощью деления с остатком на основание системы счисления 2. Если есть число , то его последняя цифра в его двоичном представлении равна

.

Взяв же целую часть от деления на 2:

,

получим число, имеющее то же двоичное представление, но без последней цифры. Таким образом, достаточно повторять приведенные две операции пока поле очередного деления не получим целую часть равную 0. Без рекурсии это будет выглядеть так:

  while x>0 do begin c:=x mod 2; x:=x div 2; write(c); end;

Проблема здесь в том, что цифры двоичного представления вычисляются в обратном порядке (сначала последние). Чтобы напечатать число в нормальном виде придется запомнить все цифры в элементах массива и выводить в отдельном цикле.

 

 

С помощью рекурсии нетрудно добиться вывода в правильном порядке без массива и второго цикла. А именно:

  procedure BinaryRepresentation(x: integer); var c, x: integer; begin {Первый блок. Выполняется в порядке вызова процедур} c:= x mod 2; x:= x div 2; {Рекурсивный вызов} if x>0 then BinaryRepresentation(x); {Второй блок. Выполняется в обратном порядке} write(c); end;

Вообще говоря, никакого выигрыша мы не получили. Цифры двоичного представления хранятся в локальных переменных, которые свои для каждого работающего экземпляра рекурсивной процедуры. То есть, память сэкономить не удалось. Даже наоборот, тратим лишнюю память на хранение многих локальных переменных x. Тем не менее, такое решение кажется мне красивым.[6],[7]


Дата добавления: 2015-08-09; просмотров: 65 | Нарушение авторских прав


Читайте в этой же книге: Введение. | Сущность рекурсии | Основные определения. Способы изображения деревьев | Прохождение деревьев | Представление дерева в памяти компьютера | Примеры рекурсивных алгоритмов | Ханойские башни | Синтаксический анализ арифметических выражений | Быстрые сортировки | Задачи на графах |
<== предыдущая страница | следующая страница ==>
Сложная рекурсия| Рекуррентные соотношения. Рекурсия и итерация

mybiblioteka.su - 2015-2024 год. (0.006 сек.)