Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,362
новичок: uvapke
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование информационно-поисковой библиографической системы на gpss ...
Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Лабораторная работа по динамическим спискам на Turbo Pascal (перемещение...

Удаление хвостовой рекурсии
Вернемся к ранее представленным функциям для
и . Также вспомним функцию BigAdd, которая
исчерпывает память стека для относительно малых входных значений.
function Factorial(num : Integer) : Integer;
begin
if (num<=0) then
Factorial := 1
else
Factorial := num*Factorial(num-1);
end;
function Gcd(A, В : Longint) : Longint;
begin
if (B mod A)=0 then
Gcd := A
else
Gcd := Gcd(B mod A,A);
end;
function BigAdd(n : Double) : Double;
begin
if (n<=l) then
BigAdd := 1
else
BigAdd := n+BigAdd(n-l) ;
end;



Во всех этих функциях перед окончанием работы делается один рекурсивный
шаг. Этот тип рекурсии в конце процедуры называется остаточной или хвостовой рекурсией (tail recursion).
Поскольку после рекурсивного шага в процедуре ничего не происходит, мож-
но запросто ее удалить. Вместо рекурсивного вызова функции процедура изменя-
ет свои параметры, устанавливая в них те значения, которые бы она получила при
рекурсивном вызове, и затем выполняется снова.
Рассмотрим эту общую рекурсивную процедуру:
procedure Recurse(A : Integer);
begin
// Выполнение каких-либо действий, вычисление В, и т.д.
Recurse(B);
end;



Эту процедуру можно переписать без рекурсии следующим образом:
procedure NoRecurse(A : Integer);
begin
while (не выполнено) do
begin
// Выполнение каких-либо действий, вычисление В, и т.д.
А := В;
end;
end;



Данный процесс называется устранением остаточной рекурсии или устране-
нием хвостовой рекурсии
(tail recursion removal или recursion removal). Такой при-
ем не уменьшает время выполнения программы. Просто рекурсивные шаги заме-
нены циклом while.
Устранение остаточной рекурсии тем не менее позволяет избежать вызова про-
цедуры, поэтому может увеличить скорость алгоритма. Важно то, что этот метод
экономит стековое пространство. Алгоритмы, подобные функции BigAdd, кото-
рые ограничены глубиной рекурсии, могут от этого значительно выиграть.
Некоторые компиляторы автоматически удаляют остаточную рекурсию, но
компилятор Delphi этого не делает. Иначе функция BigAdd, представленная в пре-
дыдущем разделе, не вызывала бы переполнение стека.
Если устранить хвостовую рекурсию, переписать функции вычисления фак-
ториала, НОД и BigAdd достаточно просто.
function Factorial(num : Integer) : Integer;
begin
Result := 1;
while (num>l) do
begin
Result := Result*num;
Num := num-1; // Подготовка к рекурсии.
end;
end;
function Gcd(A, В : Longint) : Longint;
var
b_mod_a : Longint ;
begin
b_mod_a := В mod A;
while (b_mod_a<>0) do
begin
// Подготовка аргументов к рекурсии.
В := А;
А := b_mod_a;
b_mod_a := В mod A;
end;
Result := А;
end;
function BigAdd(n : Double) : Double;
begin
Result := 1;
while (n>l) do
begin
Result :=. Result+N;
N := n-1;
end;
end;



Алгоритмы вычисления факториала и НОД практически не отличаются в сво-
их рекурсивном и нерекурсивном вариантах. Обе версии выполняются достаточ-
но быстро и могут оперировать большими (в разумных пределах) значениями.
Опубликовал Kest October 20 2009 20:12:52 · 0 Комментариев · 8010 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Панель Наша Кнопка
Flud Vkontakte.ru
Blobs [Исходник н...
Dealer
Handles
Borland C++Builde...
Керниган Б.В., Ри...
PDJPack
Visual Studio 200...
Голосование для ...
Система баннеро...
Matrix2D
Blib [Исходник на...
Модифицированная ...
DAlarm
PolyFlow
BIOS
Интерактивный инт...
CLR via C#
Удаление своего EXE

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97829
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5981
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Типы ID и IDREF
Смена пользователя
Настройка параметр...
ФУНКЦИОНАЛЬНАЯ СТР...
Листинг 2.13, 2.14
Если вы не работае...
Описание типа доку...
Добавление объекта...
Игры в казино Онлайн!
Часть 2. Решение
Нарушение биполярн...
Доступ к аргумента...
Карта END
Canon 1210 картридж
Прекращение выполн...
Собираем поисковый...
Групповые функции ...
Игра «Крестики нол...
повлиять на развер...
Игровые автоматы В...
SL Casino Riga – ш...
Система РВМ
Выбор доменного им...
Сигареты оптом: ка...
К головоломке "зеб...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?