![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Рекурсия – это способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе (прямо или косвенно, через другие процедуры).
Рекурсивная процедура осуществляет многократный переход от некоторого текущего уровня организации алгоритма к более низкому последовательно до тех пор, пока не будет получено тривиальное решение поставленной задачи.
Рассмотрим программу с рекурсивным вызовом на примере факториала
(n! = 1* 2 * 3 * … * n).
Proqram rec_1;
var f: longint;
Function fact (f: inteqer): longint;
{описание функции, f – формальный параметр, значение типа inteqer, результат функции – типа longint}
Begin
if f = 0
then fact: = 1
else fact: = f * fact (f - 1)
End;
Begin
write (Введите число f > 0 ');
Readln (f);
if f > 0
then writeln('Для числа ',N,' значение фак-
ториала = ', fact(f))
else writeln(' число неверное! ');
End.
Использование рекурсивной формы организации алгоритма дает более компактный текст программы, но выполняется медленнее и может вызвать переполнение стека. Стек – специальным образом организованная область памяти, в которой размещаются при каждом входе в подпрограмму ее локальные переменные.
Вызов процедурой самой себя (рекурсивный вызов) ничем не отличается от вызова другой процедуры.
Что происходит, если одна процедура (или программа) вызывает другую? В общих чертах происходит следующее:
1) в памяти размещаются параметры, передаваемые процедуре (но не параметры-переменные);
2) в другом месте памяти сохраняются значения внутренних переменных вызывающей процедуры;
3) запоминается адрес возврата в вызывающую процедуру (или программу);
4) управление передается вызванной процедуре.
Если процедуру (функцию) вызвать повторно из другой процедуры или из нее самой, то будет выполняться тот же алгоритм, но работать он будет с другими значениями параметров и внутренних переменных. Это и дает возможность рекурсии.
П р и м е р. Пусть рекурсивная функция step(a: real; n: inteder): real; возводит число a в степень n (a n). Вычислить Z = Xk + Ym.
Program rec_2;
var a, y, z: real;
k, m: integer;
function step (a: real; n: integer): real;
Begin
if n = 0
then step: = 1
else step: = a * step (a, N -1)
End;
Begin
Дата публикования: 2014-10-25; Прочитано: 718 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!