Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Указатели на функции.doc
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
45.89 Кб
Скачать

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() находится в левой части оператора присваивания, что позволяет занести в элемент новое значение.

Рекурсивные функции

Рекурсия – это способ организации обработки данных в функции, когда функция обращается сама к себе прямо или косвенно.

Функция называется косвенно рекурсивной, если она содержит обращение к другой функции, которая содержит прямой или косвенный вызов определяемой (первой) функции.

Если в теле функции явно используется вызов этой функции, то имеет место прямая рекурсия.

Рекурсивная форма алгоритма дает более компактный текст программы, но требует дополнительных затрат оперативной памяти для размещения данных и времени для рекурсивных вызовов функции.

Рекурсивный алгоритм позволяет повторять операторы тела функции многократно, каждый раз с новыми параметрами, конкурируя тем самым с итерационными методами (с циклами).

И также как и в итерационных методах, алгоритм должен включать условие для завершения повторения обработки данных, то есть иметь ветвь решения задачи без рекурсивного вызова функции.

Как было сказано выше, использование рекурсии не дает никакого практического выигрыша в программной реализации, и ее следует избегать, когда есть очевидное итерационное решение.

При выполнении рекурсивной функции происходит многократный ее вызов, при этом

  1. в стеке сохраняются значения всех локальных переменных и параметров функции для всех предыдущих вызовов, выделяется память для локальных переменных очередного вызова;

  2. переменным с классом памяти extern и static память выделяется один раз, которая сохраняется в течение всего времени программы;

  3. вызов рекурсивной функции происходит до тех пор, пока не будет получено конкретное значение без рекурсивного вызова функции.

Примеры :

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) );

}