По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Подпрограммы
4.6 Рекурсивные функции
Под рекурсией в программировании понимают подпрограмму, которая вызывает сама себя. Рекурсивные функции чаще всего используют для компактной реализации рекурсивных алгоритмов. Классическими рекурсивными алгоритмами могут быть возведение числа в целую положительную степень, вычисление факториала. С другой стороны, любой рекурсивный алгоритм можно реализовать без применения рекурсий. Достоинством рекурсии является компактная запись, а недостатком расход памяти на повторные вызовы функций и передачу параметров. Кроме того, существует опасность переполнения памяти.
В рекурсивной функции необходимо обязательно предусмотреть завершение рекурсивного вызова. Иначе функция никогда не завершит свою работу.
Рассмотрим применение рекурсии на примерах.
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
Вычисление факториала подробно рассмотрено в задаче 3.10 (рисунок 3.29). Для решения этой задачи с применением рекурсии создадим функцию factoial, алгоритм которой представлен на рисунке 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.
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
Результатом возведения числа a в целую степень n является умножение этого числа на себя n раз. Но это утверждение верно только для положительных значений n. Если n принимает отрицательные значения, то . В случае если
, то
.
Для решения задачи создадим рекурсивную функцию stepen, алгоритм которой представлен на рис. 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.
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
Если нулевой элемент последовательности равен нулю, первый — единице, а каждый последующий представляет собой сумму двух предыдущих, то это последовательность чисел Фибоначчи (0, 1, 1, 2, 3, 5, 8, 13, 21, 34,... ).
Алгоритм рекурсивной функции fibonachi изображен на рис. 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.