По теме лабораторной работы
Рекурсивным называтся любой объект, который частично определяется через себя.
Например, приведенное ниже определение двоичного кода является рекурсивным:
<двоичный код> ::= <двоичная цифра> | <двоичный код><двоичная цифра>
<двоичная цифра> ::= 0 | 1
Здесь для описания понятия были использованы, так называемые, металингвистический формулы Бэкуса-Наура (язык БНФ); знак "::=" обозначает "по определению есть", знак "|" — "или".
Вообще, в рекурсивном определении должно присутствовать ограничение, граничное условие, при выходе на которое дальнейшая инициация рекурсивных обращений прекращается.
Классический пример, без которого не обходятся ни в одном рассказе о рекурсии, — определение факториала. С одной стороны, факториал определяется так: n!=1*2*3*...*n. С другой стороны,
Граничным условием в данном случае является n<=1.
Пример 2. Определим функцию K(n), которая возвращает количество цифр в заданном натуральном числе n:
Обращение к рекурсивной подпрограмме ничем не отличается от вызова любой другой подпрограммы. При этом при каждом новом рекурсивном обращении в памяти создаётся новая копия подпрограммы со всеми локальными переменными. Такие копии будут порождаться до выхода на граничное условие. Очевидно, в случае отсутствия граничного условия, неограниченный рост числа таких копий приведёт к аварийному завершению программы за счёт переполнения стека.
Порождение все новых копий рекурсивной подпрограммы до выхода на граничное условие называется рекурсивным спуском. Максимальное количество копий рекурсивной подпрограммы, которое одновременно может находиться в памяти компьютера, называется глубиной рекурсии. Завершение работы рекурсивных подпрограмм, вплоть до самой первой, инициировавшей рекурсивные вызовы, называется рекурсивным подъёмом.
Пример: Нахождение факториала
double Factorial(int N)
{
double F;
if (N<=1) F=1.; else F=Factorial(N-1)*N;
return F;
}
Пример 2.
int K(int N)
{
int Kol;
if (N<10) Kol=1; else Kol=K(N/10)+1;
return Kol;
}
Пример 3.
int C(int m, int n)
{
int f;
if (m==0||m==n) f=1; else f=C(m, n-1)+C(m-1, n-1);
return f;
}
Задания для лабораторной работы: