Рекурсивной называют функцию, которая прямо или косвенно вызывает сама себя. Если в теле функции используется вызов этой же функции, то имеет место прямая рекурсия. Если же функция содержит обращение к другой функции, содержащей вызов первой функции, то она называется косвенно рекурсивной.
Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое множество локальных переменных. Т.о. переменные, расположенные вне вызываемой функции, не изменяются.
Пример 1. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n!= 1 , если n<= 1 и n!= ( n -1 )! · n, если n > 1
long fact( int n) { if (n <0) return 0; if (n==0) return 1; return (n * fact ( n -1 )); // функция fact вызывает саму себя }
Таким образом, последовательно вызываются функции f(n), f(n-1),f(n-2)…f(0).
Для отрицательного аргумента функция возвратит нулевое значение по определению факториала. Последовательность рекурсивных обращений к функции fact() прерывается при вызове fact(0). Именно этот вызов приводит к последнему значению 1 в произведении, так как последнее выражение, из которого вызывается функция, имеет вид: 1*fact(1-1).
Пример 2. Составить рекурсивную функцию, которая
возводит в целую степень вещественное число.
double step(double a, int n) { if (n==0) return 1; if (a==0.0) return 0; if (n>0) return a*step(a,n-1); if (n<0) return step(a,n+1)/a; }
При обращении step(2.0,3) рекурсивно выполняются вызовы функции с изменяющимся вторым аргументом: step(2.0,3), step(2.0,2), step(2.0,1), step(2.0,0). При этих вызовах последовательно вычисляется произведение 2.0*2.0*2.0*1. Вызов функции для отрицательного значения степени, например, step(2.0,-3) эквивалентен вычислению выражения 1 / 2.0 / 2.0 / 2.0.
Достоинством рекурсий является компактная запись, а недостатком – расход времени и памяти на повторные вызовы функции и передачу ей копий параметров.
1. Что такое рекурсия?
2. Как меняются локальные и глобальные переменные в рекурсиях?
3. Где находится окончание рекурсии?
4. Достоинство и недостаток рекурсии.