- •Указатели на функции
- •Тип функции (* имя указателя) (спецификация параметров)
- •Int * ( * fptr ) ( char * , int );
- •Int (*ptr) (char*);
- •Имя_ указателя (список фактических параметров); (* имя указателя) (список фактических параметров);
- •Int len (char* e) {
- •Int main (){
- •Int (*ptr) (char*); //объявлен указатель на функцию
- •Массивы указателей на функции
- •Float ( * ptrArray [ 4 ] ) ( char , int ) ;
- •Определение типа указателя на функцию
- •Typedef int (* ptr) ( int);
- •Typedef void (* ptf ) ( ptr , int , char*);
- •Int main () { int n;
- •Void table ( func ptrA [ ] , int n, float xn , float xk , float dx )
- •Int main () {
- •Void main ( )
- •Ссылка на функцию Определение:
- •Void main ( )
- •Void (*pf) (char) (func) ;
- •Void (& rf)(char)( func ); Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •Int & rmax ( int n , int d [ ] )
- •Void main ()
- •Рекурсивные функции
- •Шаблоны функций
- •Void swap (t&X, t&y)
- •Void swap (long &X, long &y) //2
- •Void swap (double &X, double &y) //3
- •Void main()
- •Свойства:
- •B func ( a r, c t ) { b V; …} -ошибка
- •Перегрузка функций
- •Void f (int);
- •Void f (int, int);
- •Void f (char*);
- •Void main ()
- •Подставляемые функции
- •Inline float Line(float x1,float y1,float x2, float y2)
Int & rmax ( int n , int d [ ] )
{ int imax =0;
for ( int i =1 ; i< n ; i++)
imax = d[imax] > d[i] ? imax :i ;
return (d [imax] );
}
Void main ()
{ int n =5, a [ ] = { 3, 7 , 21 , 33 , 6};
cout << rmax (n, a );
rmax(n,a)=0;
for ( int i =0 ; i <n ; i++)
cout << a[i] << “ “ ;
} //выведется 3 7 21 0 6
Один из вызовов функции rmax() находится в левой части оператора присваивания, что позволяет занести в элемент новое значение.
Рекурсивные функции
Рекурсия – это способ организации обработки данных в функции, когда функция обращается сама к себе прямо или косвенно.
Функция называется косвенно рекурсивной, если она содержит обращение к другой функции, которая содержит прямой или косвенный вызов определяемой (первой) функции.
Если в теле функции явно используется вызов этой функции, то имеет место прямая рекурсия.
Рекурсивная форма алгоритма дает более компактный текст программы, но требует дополнительных затрат оперативной памяти для размещения данных и времени для рекурсивных вызовов функции.
Рекурсивный алгоритм позволяет повторять операторы тела функции многократно, каждый раз с новыми параметрами, конкурируя тем самым с итерационными методами (с циклами).
И также как и в итерационных методах, алгоритм должен включать условие для завершения повторения обработки данных, то есть иметь ветвь решения задачи без рекурсивного вызова функции.
Как было сказано выше, использование рекурсии не дает никакого практического выигрыша в программной реализации, и ее следует избегать, когда есть очевидное итерационное решение.
При выполнении рекурсивной функции происходит многократный ее вызов, при этом
в стеке сохраняются значения всех локальных переменных и параметров функции для всех предыдущих вызовов, выделяется память для локальных переменных очередного вызова;
переменным с классом памяти extern и static память выделяется один раз, которая сохраняется в течение всего времени программы;
вызов рекурсивной функции происходит до тех пор, пока не будет получено конкретное значение без рекурсивного вызова функции.
Примеры :
1) Определить
функцию, возвращающую значение
факториала целого числа. Факториал
определятся только для положительных
чисел формулой:
,
и факториал нуля равен 1 ( 0!
=1).
Определение
факториала можно переписать в виде
“математической рекурсии “:
, то есть
факториал вычисляется через факториал.
Соответственно определение функции:
long fact ( int k)
{ if ( k <0 ) return 0 ;
if ( k = = 0 ) return 1 ; // здесь рекурсия прерывается;
return k * fact ( k - 1) ;
}
2) Определить функцию, возвращающую целую степень вещественного числа. Определение целой n-ой степени числа X можно представить в виде:
X n = X * Xn-1 при n >0,
X n = Xn+1 / X при n< 0,
и в соответствии с этим определить рекурсивную функцию:
double step ( double X , int n )
{ if ( n = = 0 ) return 1; // здесь рекурсия прерывается;
if ( X = = 0) return 0 ;
if ( n > 0 ) return X * step ( X , n-1 );
if ( n < 0 ) return step ( X , n+1 ) / X;
}
3) Определить функцию, возвращающую сумму элементов массива. Запишем формулу для суммы n элементов в виде суммы последнего элемента и суммы первых n-1 элементов:
Sn = a[n-1] + Sn-1,
то есть сумма вычисляется через сумму. Соответственное определение рекурсивной функции:
int sum (int a[] , int n )
{ if (n = = 1) return ( a[0] ); // здесь рекурсия прерывается;
else return ( a[n-1] + sum (a, n-1) );
}
