-
Основы Delphi
- Основы программирования на Delphi
- Компоненты Delphi. Начинаем писать свои первые приложения на Delphi
- Основные принципы программирования в Delphi. Начинаем программировать самостоятельно
- Delphi и Microsoft Word
- Delphi и Microsoft Excel
- Delphi и Microsoft Access
- Delphi и OpenOffice Writer
- Delphi и OpenOffice Calc
- Создание игр на Delphi
- Игра Пристрели птичку
Delphi и MSOffice
Delphi и OpenOffice
Delphi и Интернет
Delphi и игры
Delphi Android
Школа программирования Delphi
Портал DelphiSchool является бесплатным проектом, обеспечивающим пользователям быстрый и легкий доступ к урокам программирования на Delphi. Сайт позволяет научиться программировать на Делфи любому, кто хочеть писать свои программы, игры, Android приложения, программы для MAC OC или IOS. Кроме уроков Delphi и статей Delphi, на сайте доступны также и видеоуроки. Практически к каждому уроку, пользователю доступен исходник, изучив который, он сможет наглядно посмотреть как работает та или иная программа, написанная на Делфи. Кроме того мы постараемся прилагать к каждому материалу (статье, уроку, видеоуроку) файлы Delphi, которые будут помогать изучить предоставленный материал.
Каждый кто решил написать свою программу, создать свое приложение, научиться программировать и т.д., найдет на DelphiSchool статьи Delphi, уроки Delphi, видеоуроки Delphi, исходники Delphi, файлы Delphi, изучит компоненты Delphi, посмотрит Delphi примеры и многое другое абсолютно бесплатно. Все о Delphi программировании теперь собрано на одном сайте!!!
Главная » Уроки Delphi » Основы Delphi » Основы программирования на 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 в закладки: |
Диалоговые окна в Delphi. ShowMessage, MessageDlg, MessageDlgPos, InputBox и InputQuery |
Delphi и RadioGroup. Пример работы с группой компонентов RadioButton в Делфи |
Основы работы с MS Word. Создание, открытие, сохранение и закрытие документа Word с помощью Delphi |
Delphi и TButton. Учимся работать с кнопкой в Delphi. Часть 2. События кнопки |
Delphi и ComboBox. Пример работы с ниспадающими списками в Делфи |
Delphi и TEdit. Пример работы со строками ввода в Делфи |
Константы в Delphi. Объявление констант в Делфи |
Управление циклами в Delphi. Операторы Continue и Break. |
Delphi и CheckBox. Пример работы с CheckBox в Делфи |
Delphi и TPanel. Пример работы с панелями в Делфи |
Всего комментариев: 0 | |