Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Рекурсия

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

}

}


 

<== предыдущая лекция | следующая лекция ==>
Перегрузка функций | Распределение памяти при использовании функций
Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 367; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.