Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 762 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 4:

Подпрограммы

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

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

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

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

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

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

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

увеличить изображение
Рис. 4.9. Рекурсивный алгоритм вычисления факториала

Текст подпрограммы с применением рекурсии на языке Free Pascal:

function factorial ( n : word ) : longint;
begin
	if n<=1 then factorial :=1
	else factorial :=n * factorial ( n-1)
end;
var i : integer;
begin
	write ( ’ i= ’ ); read ( i );
	write ( i, ’ != ’, factorial ( i ) );
end.
ЗАДАЧА 4.8. Вычислить n-ю степень числа a (n — целое число).

Результатом возведения числа a в целую степень n является умножение этого числа на себя n раз. Но это утверждение верно только для положительных значений n. Если n принимает отрицательные значения, то a^{-n}= 1/a^n. В случае если n = 0, то a^0 = 1.

Для решения задачи создадим рекурсивную функцию 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 )
		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
	else
		fibonachi := fibonachi ( n-1)+ fibonachi ( n - 2);
end;
var x : word;
begin
	write ( ’Введите номер числа Фибоначчи x= ’ );
	readln ( x );
	writeln ( x, ’  е - число Фибоначчи =  ’, fibonachi ( x ) );
end.
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.