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

Рекурсивная функция

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

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

Рекурсию можно рассматривать как еще одну управляющую структуру – управление из точки рекурсивного вызова передается на начало функции.

Ключевым фактором обеспечения рекурсии является использование стека. Стек – особое устройство оперативной памяти по принципу: последним пришел – первым вышел.

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

При рекурсии функция, не завершив своего выполнения, вызывается снова и снова. Стек постоянно пополняется, не освобождаясь, и может переполниться. Этого допустить нельзя.

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

Числа Фибоначчи

, n>2

a=0, b=1, c=a+b, a=b, b=c

int Fib(int n)

{

if(n==0)

return 0;

else if(n==1)

return 1;

else

return Fib(n-2)+Fib(n-1);

}

int main(void)

{

cout<<Fib(5)<<endl;

return 0;

}

Задача: вычислить факториал числа N

N!=N*(N-1)

int fakt(int n)

{

if ((n==1)or(n==0))

return n;

else

return fakt(n-1)*n;

}

+

  1. Передача функции в другую функцию через указатель. Параметр функции. Указатель на функцию.

Для передачи функции в функцию пользователя необходимо уметь:

1) объявить параметр – указатель на функцию

2) внутри функции, опираясь на указатель, вызвать переданную функцию при переданном аргументе

3) вызывая функцию, передать адрес конкретной функции для соответствующего аргумента

Как объявить указатель на функцию?

void (*f1)(void); // объявлена переменная f1 – указатель на тип void, не имеющую параметров.

int (*f2)(int, double); // объявлена переменная f2 – указатель на тип int, имеющая два параметра: на тип int и double

double (*f)(double); // объявлена переменная f – указатель на тип double, имеет один параметр типа double

Отсюда видно, что при объявлении указателя на функцию важны характеристики функции: тип функции, количество и порядок следования параметров.

Как поместить в указатель конкретное значение?

В указатель на функцию можно поместить адрес конкретной функции с соответствующими характеристиками.

double (*f)(double);

double sin(double);

f=sin;

Имя конкретной функции – ее адрес.

Как вызвать функцию, опираясь на адрес?

double rez=f(M_PI/2);

Написать функцию вычисления интеграла

Integral

double (*f)(double);

double a, double b

int n

#include<iostream>

using namespace std;

double Integral(double (*f)(double) … ?

{

int i;

double h=(b-a)/n, integ=0;

for (i=0; i<n, i++)

integ+=f(a+i*h);

return h*integ;

}

double func(double x)

{

return x*x-1;

}

#include <math.h>

int main(void)

{

double rez;

rez=Integral(sin,0,3.14,10000);

cout<<rez<<endl;

rez=Integral(func,0,2,10000);

cout<<rez<<endl;

return 0;

}

+

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]