Program Primer;. Var i: Integer; описание переменных головной программы
Uses CRT;
Var i: Integer; описание переменных головной программы
Function Func_1(x: Integer): Integer; Forward; опережающее объявление функции Func_1
Function Func_2(y: Integer): Integer; описание функции
Var k: Integer; Func_2
Begin
………
k := Func_1(y); обращение к функции Func_1
………
End;
Function Func_1; описание функции
Var n: Integer; Func_1 без списка формальных
Begin параметров
……….
n := Func_2(x); обращение к функции Func_2
……….
End;
Begin основная программа
……..
i := Func_1(i); обращение к функции Func_1
…….. в основной программе
End.
Примеры:
1. Составить функцию, рекурсивно определяющую значение биномиального коэффициента при 0<m<n по формулам:
= = 1, = +
Function Binom(m, n: Word): Word;
Begin
If (m=0) Or (m=n)
Then Binom := 1 выход из рекурсии
Else Binom := Binom(m, n-1) + Binom(m-1, n-1) рекурсия
End;
2. Составить функцию, рекурсивно определяющую максимальный элемент в заданной части целочисленного массива An , начиная с k-го и до n-го элемента:
Const n = 100;
Type TArray = Array [1..n] Of Integer;
………………………………………..
Function Max_element(a: TArray; k,n: Word): Integer;
Var temp : Integer;
Begin
If (k=n)
Then Max_element := a[n]
Else
Begin
temp := Max_element(a, k+1, n);
If (a[k] > temp)
Then Max_element := a[k]
Else Max_element := temp
End;
End;
Особенности рекурсии:
· использование рекурсивной формы организации алгоритма выглядит изящнее итерационной и дает более компактный текст программы,
· недостатки рекурсии состоят в следующем:
1. если глубина рекурсии велика, то программа будет требовать во время исполнения много памяти, что может привести к переполнению стека,
2. рекурсивные алгоритмы, как правило, выполняются более медленно,
· при рекурсивном программировании велика вероятность ошибок, вынуждающих программиста к перезагрузке компьютера.
Таким образом, если у программиста есть возможность выбора между итерацией и рекурсией, то предпочтительным выбором является итерация.
В целях повышения безопасности работы рекомендуется:
· для включения проверки переполнения стека необходимо использовать директиву компилятора {S+},
· для включения проверки диапазона необходимо использовать директиву компилятора {R+},
· в начале каждой рекурсивной процедуры или функции поместить строку
If KeyPressed Then Halt.Она позволяет при зависании программы выйти из нее без перезагрузки компьютера, просто нажав любую клавишу.
Дата добавления: 2015-08-08; просмотров: 759;