05. Функции / Lesson05-presentation
.pdfПример рекурсивной функции: числа Фибоначчи
F[0] = 0
F[1] = 1
F[n] = F[n-1] + F[n-2]
0, 1, 2, 3, 5, 8, 13, …
int fib(int n)
{
if (n == 0 || n == 1) return n;
return fib(n-1) + fib(n-2);
}
терминальное условие рекурсии
Пример рекурсии: печать дерева каталогов
void printFolderTree(folderPath, level)
{
printFolderName(level);
Для всех подкаталогов subfolderPath printFolderTree(subfolderPath, level+1);
}
Переменные-функции
//Введение типа функции, возвращающей double и
//принимающей один параметр типа double typedef double (*func_t)(double);
//объявление переменной-функции
func_t myFunc;
//присваивание переменной-функции адреса какой-либо
//реальной функции подходящего типа
myFunc = sin;
// Вызов переменной-функции
double y = myFunc(x); // вернёт sin(x)
Массив переменных-функций
//Введение типа функции, возвращающей double и
//принимающей один параметр типа double typedef double (*func_t)(double);
//объявление массива функций
func_t myFuncs[10];
//заполнение массива функций адресами
//реальных функций
myFuncs[0] = sin; myFuncs[1] = cos;
…
// Вызов функции из массива
double y = myFuncs[1](x); // вернёт cos(x)
Функция как параметр другой функций
// Функция qsort из <cstdlib> требует параметр-функцию
void qsort(void *base, size_t nElems, size_t elemSize, int(*fCmp)(const void *, const void *));
// Нужно создать функцию такого типа
int intCmp(const void * pa, const void * pb)
{
…
}
// и передать её в качестве параметра функции qsort qsort (&a[0], 10, sizeof(int), intCmp);