Информация

Школа программирования Delphi

Портал DelphiSchool является бесплатным проектом, обеспечивающим пользователям быстрый и легкий доступ к урокам программирования на Delphi. Сайт позволяет научиться программировать на Делфи любому, кто хочеть писать свои программы, игры, Android приложения, программы для MAC OC или IOS. Кроме уроков Delphi и статей Delphi, на сайте доступны также и видеоуроки. Практически к каждому уроку, пользователю доступен исходник, изучив который, он сможет наглядно посмотреть как работает та или иная программа, написанная на Делфи. Кроме того мы постараемся прилагать к каждому материалу (статье, уроку, видеоуроку) файлы Delphi, которые будут помогать изучить предоставленный материал.

Каждый кто решил написать свою программу, создать свое приложение, научиться программировать и т.д., найдет на DelphiSchool статьи Delphi, уроки Delphi, видеоуроки Delphi, исходники Delphi, файлы Delphi, изучит компоненты Delphi, посмотрит Delphi примеры и многое другое абсолютно бесплатно. Все о Delphi программировании теперь собрано на одном сайте!!!

DelphiSchool

Полезное
Книга
Форма входа
Поиск по сайту
Статистика сайта


Онлайн всего: 1
Гостей: 1
Пользователей: 0
Новости
Рекламный блок
Главная » Уроки Delphi » Основы Delphi » Основы программирования на Delphi

Рекурсивный вызов процедур в Delphi

Вы искали Рекурсивный вызов процедур в Delphi и специально для вас мы подготовили этот урок Delphi. К каждому уроку мы стараемся предоставлять исходники Delphi, поэтому в конце статьи Рекурсивный вызов процедур в Delphi вы можете посмотреть пример Delphi, или код Delphi, что позволит изучить Рекурсивный вызов процедур в Delphi более детально.
Изучайте программирование онлайн на сайте www.DelphiSchool.3dn.ru и освойте основы программирования. Обучение программированию на DelphiSchool это программирование для начинающих и опытных программистов.
Рекурсивный вызов процедур в Delphi Рекурсивный вызов – это когда процедура вызывает сама себя. Допустим, что внутри. Процедуры нужно выполнять абсолютно один и тот же код, только с другими параметрами. Писать из-за этого новую процедуру нет смысла, потому что код повторится. А если таких вызовов будет десять? Тогда программа может необоснованно вырасти.
Вспомним нашу классическую задачу – расчет факториала. Хотя этот пример не эффективен и легче (да и быстрее) сделать то же самое с помощью простого цикла, все же рассмотрим его чисто в познавательных целях. В реальной жизни никогда не решайте такие задачи с помощью рекурсии.
Для расчета нам понадобится функция, назовем ее MulNumber. Ей будет передаваться одно число, а возвращаться будет результат умножения переданного числа на число, меньшее на единицу.
Код
function TForml.MulNumber(index: Integer:Integer;
begin
Result:=Index*Index-1;
end;

Если мы будем пользоваться такой функцией, то потребуется вызывать ее для каждого числа факториала. Это никому не нужно, поэтому давайте добавим сюда рекурсию:
Код
function TForml.MulNumber(index: Integer):Integer;
begin
Result:=Index*MulNumber(index-1);
end;

Теперь переменная index умножается на результат вызова функции MulNumber с параметром на единицу меньшим, чем index. Получается, что прежде чем перемножить index и MulNumber, сначала выполнится процедура MulNumber и потом уже произойдет умножение. Но при расчете MulNumber с новым значением опять будет вызвана эта же функция, но с еще более маленьким значением. В принципе, нас это устраивает, потому что нужно произвести перемножение всех чисел от начального значения index и до 1. Но как программа узнает о том, что нам нужно остановиться на этой единице? Да никак. Она будет продолжать уменьшать index и снова вызывать саму себя с новым параметром. Так переменная index уменьшится до отрицательного значения и будет быстро уходить в бесконечность. Такая ситуация плачевна и приводит к ошибке программы, потому что рекурсию невозможно прервать.
Мы сами должны написать код, который будет прерывать рекурсию:
Код
function TForm1.MulNumber(index: Integer):Integer;
begin
if Index=1 then begin
Result:=1;
exit;
end;
Result:=Index*MulNumber(index-1);
end;

Здесь сначала происходит проверка равенства index и 1. Дальше уже рассчитывать не надо и нужно выходить из процедуры. В качестве результата возвращается 1, потому что его перемножение на другое число при расчете факториала не повлияет на общий результат. Чтобы мы ни умножали на единицу, результат не изменится. Таким образом, мы сделали прерывание на 1, и после этого рекурсия заканчивается. При index, равной единице, не произойдет очередного вызова процедуры MulNumber.
Теперь, чтобы рассчитать пример, мы должны всего лишь из любой точки вызвать эту процедуру и указать в качестве параметра число, факториал которого нам надо рассчитать.
Рассмотрим более полезный алгоритм с использованием рекурсии – поиск файла на диске. Это будет именно алгоритм, потому что показывать сейчас код будет слишком сложным занятием. В дальнейшем этот алгоритм мы реализуем в реальной программе, а пока ограничимся его абстрактным определением:
function FindFile(MMH файла, папка);
begin
Получить список содержимого папки;
Проверить содержимое папки;
Если среди файлов нет искомого, то вызвать функцию FindFile для вложенных папок, чтобы повторить поиск там.
end;
Это чисто абстрактный алгоритм и в реальности код будет работать немного по-другому. Но главная его цель - показать принцип рекурсии и более полезный пример ее использования.
Работать с рекурсивным вызовом нужно осторожно, потому что он может вызвать зависание программы. Хотя в большинстве случаев программа вылетит с ошибкой переполнения стека и ОС не пострадает, плюсов вашей программе это не даст. Когда пишете рекурсию, необходимо быть уверенным, что обязательно существует ситуация, при которой рекурсия будет прервана.
Категория: Основы программирования на Delphi | Добавлено: 04.05.2014 | Просмотров: 2552 | Рейтинг: 0.0/0

Добавить Рекурсивный вызов процедур в Delphi в закладки:



Не забывайте писать свои отзывы об уроке Рекурсивный вызов процедур в Delphi. Ваша информация об уроке Рекурсивный вызов процедур в Delphi может помочь другим людям изучить программирование на Delphi. Также не забывайте проставлять рейтинг урока, ведь от этого зависит его попадание в список лучших уроков Delphi
Всего комментариев: 0
dth="100%" cellspacing="1" cellpadding="2" class="commTable">
Имя *: Email:
Код *: