Рекурсия

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) ); //рекурсивный вызов

}

}