Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lazarus.pdf
Скачиваний:
527
Добавлен:
09.02.2015
Размер:
4.79 Mб
Скачать

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

198

Рисунок 4.6: Решение линейного уравнения

Рисунок 4.7: Решение квад-

Рисунок 4.8: Решение кубиче-

ратного уравнения

ского уравнения

4.6 Рекурсивные функции

Под рекурсией в программировании понимают подпрограмму, которая вызывает сама себя. Рекурсивные функции чаще всего используют для компактной реализации рекурсивных алгоритмов. Классиче-

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

199

скими рекурсивными алгоритмами могут быть возведение числа в целую положительную степень, вычисление факториала. С другой стороны, любой рекурсивный алгоритм можно реализовать без применения рекурсий. Достоинством рекурсии является компактная запись, а недостатком расход памяти на повторные вызовы функций и передачу параметров, кроме того, существует опасность переполнения памяти.

В рекурсивной функции необходимо обязательно предусмотреть завершение рекурсивного вызова. Иначе функция никогда не завершит свою работу.

Рассмотрим применение рекурсии на примерах.

ЗАДАЧА 4.7. Вычислить факториал числа n.

Вычисление факториала подробно рассмотрено в задаче 3.10 (рис. 3.29). Для решения этой задачи с применением рекурсии создадим функцию factorial, алгоритм которой представлен на рис. 4.9.

Рисунок 4.9: Алгоритм вычисления факториала

Текст подпрограммы с применением рекурсии: function factorial(n:word):longint;

begin

if n<=1 then factorial:=1

else factorial:=n*factorial(n-1) end;

var i:integer; begin

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

200

write('i=');

read(i);

write(i,'!=',factorial(i));

end.

ЗАДАЧА 4.8. Вычислить n-ю степень числа a (n – целое число)

Результатом возведения числа a в целую степень n является умножение этого числа на себя n раз. Но это утверждение верно только для положительных значений n. Если n принимает отрицательные значе-

ния, то

an=

1

. В случае если n=0, то a0=1.

n

 

 

a

Для решения задачи создадим рекурсивную функцию stepen, алгоритм которой представлен на рис. 4.10.

Рисунок 4.10: Рекурсивный алгоритм вычисления степени числа

Фрагмент программы с применением рекурсии: function stepen(a:real;n:word):real;

begin

if n=0 then stepen:=1 else

if n<0 then stepen:=1/stepen(a,-n)

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus

201

else stepen:=a*stepen(a,n-1);

end; var

x:real;k:word; begin

writeln('x='); readln(x); writeln('k='); readln(k);

writeln(x:5:2,'^',k,'=',stepen(x,k):5:2);

end.

ЗАДАЧА 4.9. Вычислить n-е число Фибоначчи.

Если нулевой элемент последовательности равен нулю, первый – единице, а каждый последующий представляет собой сумму двух предыдущих, то это последовательность чисел Фибоначчи (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... ).

Алгоритм рекурсивной функции fibonachi изображен на рис. 4.11.

Рисунок 4.11: Рекурсивный алгоритм вычисления числа Фибоначчи

Текст подпрограммы:

function fibonachi(n:word):word; begin

if (n=0)or(n=1) then fibonachi:=n

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]