Рекурсивные функции
Функция является рекурсивной, если вызывает саму себя. Рекурсия может быть прямой и косвенной. Прямая рекурсия – функция вызывает саму себя явно. Косвенная рекурсия – функция вызывает саму себя через другие функции. Ниже представлен классический пример рекурсивной функции для вычисления факториала.
#include <stdio.h>
int fact(int a) // Рекурсивная функция для вычисления факториала
{
if (a<0) return 0;
if (a==0) return 1;
return a*fact(a-1); // Вызов функции внутри себя
}
void main()
{
printf("fact(5)=%d", fact(5)); // Печатается fact(5)=120
}
Следует отметить, что рекурсивные функции необходимо применять аккуратно, так как в случае ошибок возможна бесконечная последовательность рекурсивных вызовов. Считается, что рекурсию не следует применять, если есть явное итерационное решение, например, для вычисления факториала, приведенный выше пример является число демонстрационным. Но существуют некоторые классы задач, для которых использование рекурсивных функций является удобным.
7.7. Подставляемые (inline) функции
Подставляемая функция это функция, определяемая с модификатором inline. Для обычной функции код функции существует в единственном экземпляре не зависимо от количества ее вызовов. Для подставляемой функции код функции существует в стольких экземплярах, сколько раз функция вызывается. Компилятор подставляет исполняемый код функции в точку вызова. Недостаток подставляемых функций - объем исполняемого кода программы возрастает, преимущество – возможен некоторый выигрыш в быстродействии, так как не требуется время на передачу управления на код функции при ее вызове.
Подставляемые функции появились в языке Си++, в исходном языке Си их не было.
Существует некоторые ограничения на использование подставляемых функций. Функция не может быть подставляемой:
• функция слишком велика;
• функция рекурсивная;
• обращение к функции идет до ее определения;
• функция вызывается более 1 раза в одном выражении;
• функция имеет цикл, переключатель или оператор goto.
При невыполнении перечисленных ограничений ошибки не будет, просто компилятор будет считать данную функцию не подставляемой, некоторые компиляторы могут при этом выдавать предупреждение. Обычно подставляемые функции являются небольшими, их основное назначение – вызов других функций. Ниже представлена подставляемая функция для вычисления длины вектора на плоскости.
#include <stdio.h>
#include <math.h>
inline double getVect(double x, double y)
// Функция считает длину вектора, заданного точкой x, y
{
return sqrt(x*x+y*y);
}
void main()
{
printf("%f", getVect(3., 4.));
Дата добавления: 2015-08-14; просмотров: 573;