Рекурсия
Inline-функции
При передаче управления функциям неизбежна потеря эффективности программы. Для повышения эффективности небольшие по размеру функции можно объявить как inline.
Компилятор в этом случае на самом деле не создаст функции, а просто выполнит копирование тела функции в местах ее вызова.
// Пример 5.2.9
// Пример inline-функции для получения 1-го процента числа
#include <iostream>
using namespace std;
// Заголовок inline-функции
inline double Percent (double);
// Главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double number=0 , result=0;
cout << "Введите число: ";
cin >> number;
result=Percent(number);
cout << "1 процент: " << result << endl;
result =Percent(number) *50;
cout << "50 процентов: " << result << endl;
result =Percent(number)*0.5;
cout << "0.5 процента: " << result << endl;
cin.get(); cin.get();
}
// Реализация функции для получения 1-го процента числа
double Percent(double number) {
return 0.01*number;
}
Функция может вызывать саму себя. Это называется рекурсией. Некоторые задачи проще решаются рекурсивным способом.
Рекурсивный метод использует стековую память компьютера. Размер стека ограничен. Рекурсивная программа может завершиться ошибкой выполнения из-за нехватки стековой памяти. Рекурсия всегда может быть заменена циклом.
// Пример 5.2.10
// Посимвольный вывод строки
#include <iostream>
#include <string.h> // библиотека строковых функций С
using namespace std;
const char Str[]="Мама мыла раму."; // массив символов, строка
// объявление рекурсивной функции
void PrintStr(int);
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
PrintStr(0); // вызов рекурсивной функции
cin.get();
}
// реализация рекурсивной функции
void PrintStr(int n) {
if (n==strlen(Str)) { // strlen() - возвращает число символов в строке
cout << endl << "Рекурсивные вызовы завершены!!!" << endl;
return; //завершение рекурсивных вызовов
}
else {
cout << Str[n]; cin.get();
n++; // Str[n] - символ с номером n (нумерация с 0)
PrintStr(n); //рекурсивный вызов
}
}
// Пример 5.2.11
// Сложение N-чисел
#include <iostream>
using namespace std;
// объявление рекурсивной функции
long AddNumber(int);
// главная функция
void main(){
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
cout << AddNumber(100000) << endl; // вызов рекурсивной функции
cin.get();
}
// реализация рекурсивной функции
long AddNumber(int n) {
if (n==0) { //завершение рекурсивных вызовов
cout << endl << "Рекурсивные вызовы завершены!!!" << endl;
return 0;
}
else {
cout << "Рекурсивный вызов при n=" << n << endl;
//cin.get();
return n+ AddNumber(n-1); //рекурсивный вызов
}
}
// Пример 5.2.12
// Нахождение N-го числа Фибоначчи рекурсией
// 1,1,2,3,5,8,13,21,34...
#include <iostream>
using namespace std;
// объявление рекурсивной функции
long fib(int n);
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int n; long answer;
cout << "Введите номер числа Фибоначчи: ";
cin >> n;
answer=fib(n); // вызов рекурсивной функции
cout << "Значение числа Фибоначчи: " << answer << endl;
cin.get();cin.get();
}
// реализация рекурсивной функции
long fib(int n) {
cout << "Функция fib (" << n << ")...";
if (n<3) {
cout << "Возврат 1! \n";
return (1); //завершение рекурсивных вызовов
}
else {
cout << "Вызов fib (" << n-2 << ") и fib(" << n-1 << ").\n";
return ( fib(n-2)+fib(n-1) ); //рекурсивный вызов
}
}