1.7 Рекурсивні функції

Функція називається рекурсивною, якщо вона викликає сама себе. Розрізняють пряму та непряму рекурсії. Функція називається непрямою рекурсивною в тому разі, якщо вона містить звернення до іншої функції, що містить прямий або непрямий виклик першої функції. Якщо в тілі функції явно використовується виклик цієї функції, то має місце пряма рекурсія. Класичним прикладом рекурсії є обчислення факторіала. Факторіал невід’ємного цілого числа n дорівнює

n х (n–1) х (n–2) х. .. х 3 х 2 х 1,


причому за визначенням факторіал 1! і 0! дорівнює 1. Факторіал числа дорівнює добутку попередніх щодо нього послідовностей чисел, тобто n! = nx(n–1)!. Якщо обчислення факторіала оформити у виді рекурсивної функції, то програма може бути подана в ось якому вигляді:

// Обчислення факторіала

#include <iostream.h>

unsigned long factorial (unsigned int);

void main( )

{ int i; unsigned int n;

 cout << endl << "Введіть ціле додатне число";

 cin >> n;

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

 cout << endl << " Факторіал " << i << "!=" << factorial(i);

 return;

}

unsigned long factorial (unsigned int num);

{if (n = = 1 ¦¦ n = = 0)

 return 1;

else

 return (num*factorial(num-1));

}

Рекурсивні функції обробляються повільно й займають більше стекової пам’яті, ніж їхні нерекурсивні еквіваленти. Надто велика кількість рекурсивних викликів функції може призвести до переповнення стека. Оскільки місцем зберігання параметрів і локальних змінних функції є стек, і кожен новий виклик створює нову копію змінних, простір стека може бути вичерпаний, це викличе помилку переповнення і призведе до аварійної зупинки програми.


1.8 Вбудовані функції

 

Вбудовані функції (inline) — це функції, чиє тіло підставляється в кожну точку виклику, замість того, щоб генерувати код виклику. Модифікатор inline перед вказівкою типу результату в оголошенні функції загадує компілятору згенерувати копію коду функції у відповідному місці, щоб уникнути виклику цієї функції. У результаті виходить множина копій коду функцій, вставлених у програму, замість єдиної копії, якою передається керування при кожному виклику функції. Модифікатор inline необхідно застосовувати для невеликих і часто використовуваних функцій. Наприклад,

#include <iostream.h>

inline int min (int x1, int y1)

{ if (x1 < y1)

 return (x1);

 else

 return (y1);

}

void main( )

{ int х, у, z;

{ cout << endl << "Введіть два цілих числа ";

 cin >> х >> у;

 z = min(х, у);

 cout << endl << " Мінімальним з " << х << " і " << у << " є "

 << z;

}

Компілятор може ігнорувати модифікатор inline, якщо вбудований код надто великий, компілятор згенерує звичайний виклик функції.


1.9 Перевантажені функції

С++ дозволяє визначати функції з однаковими іменами, але унікальними типами аргументів. У цьому разі про функції кажуть, що вони перевантажені. Перевантаження функції використовується звичайно для створення кількох функцій з однаковим ім’ям, призначених для виконання схожих задач, але з різними типами даних. Наприклад,

#include <iostream.h>

int fun (int х, int у)

{ return (х*х+у*у);}

float fun (float х, float у)

{ return (х*х+у*у); }

main( )

{ int x1 = 10, y2 = 3; float x2 = 13.75, y2 = 11.25

cout << endl <<"Сума квадратів чисел " << x1<< " і " << y1 << "дорівнює "

 << fun(x1, y1)

 << endl <<"Сума квадратів чисел " << x2<< " і " << y2 << "дорівнює "

 << fun(x2, y2)

return 0;

}

Перевантажені функції розрізняються за допомогою сигнатури — комбінації імені функції і типів її параметрів. Компілятор кодує ідентифікатор кожної функції за числом і типом її параметрів, це називається декорируванням імені, щоб мати можливість здійснювати надійне зв’язування типів. Надійне зв’язування типів гарантує, що викликається належна функція і що аргументи узгоджуються з параметрами. Компілятор виявляє помилки зв’язування і видає повідомлення про них. Кожне декороване ім’я починається з символу @, який передує імені функції. Закодований список параметрів починається з символів $g. Типи значень функцій, що повертаються, не відбиваються в декорованих іменах. Перевантажені функції можуть мати різні або однакові типи значень, що повертаються, і обов’язково повинні мати різні списки параметрів. Дві функції, відмінні лише за типами значень, що повертаються, викличуть помилку компіляції.


РОЗДІЛ 2. Програмні модулі

2.1 Завдання 1 Структури

2.1.1 Постановка завдання

У файлі оперативної систекми «Task.in» зберігається в текстовій формі відмість з відомостями про продукти. Кожен рядок цього файлу містить відо-мості про один вид продукту, представлені у такому форматі: 1…2 – порядковий номер продукту; позиція 3 – пробільних літера; позиції 4…15 – назва продукту довжиною не більше 11 имволів, в довільному місці поля; позиція 16 – пробільних літера; позиції 17…19 – вміст білка в 100 грамах продукту (ціле).

Кількість продуктів у відомості дорівнює 16. Приклад зазначеного файлу:

01 щука 20

02 сом 16

Написати:

1) визначення масиву структур для зберігання зазначеної відомості і фрагмент програми, який заповнить відомість даними, вводяться з файлу операційної системи «Task.in» (введення даних повинно здійснюватися в текстовому режимі);

2) фрагмент програми для знаходження і друку (у файл «Task.out») інформацію про продукт з найбільшим вмістом білка.


Информация о работе «Розробка програм мовою С++»
Раздел: Информатика, программирование
Количество знаков с пробелами: 42425
Количество таблиц: 0
Количество изображений: 17

Похожие работы

Скачать
29682
0
0

... системах наукової класифікації. Однак перш ніж зануритися в об’єктно-орієнтовану розробку, давайте розглянемо деякі з властивостей, загальні для класу "об'єктів". Абстракція Ціль об'єктно-орієнтованого програмування полягає в тому, щоб побачити в задачі абстракції об'єктів реального світу. Що за реальні об'єкти малися на увазі? Буквально будь-які, аби вони давали представлення про функці ...

Скачать
27398
0
2

... процесором, тільки коли він працює в приміщенням режимі. Метою виконання даної курсової роботи є отримання практичних навичок роботи програмування мовою асемблера. Підсумком виконання курсової роботи є розробка алгоритму контролю на парність масиву даних, що зберігається в деякій області пам'яті і програми на мові асемблера, який реалізує даний алгоритм. 1. Загальний розділ Надійність ...

Скачать
13575
0
8

... x запишеться у вигляді наступної функції цей запис представляє собою приклад програми на мові Lisp. В даному курсовому проекті на мови Lisp розроблено програму Sierpins, яка реалізує побудову рекурсивних кривих Серінського. На початку програми встановлюється значення змінної *VMode*‚ яка керує установкою відео режиму, і за замовчуванням встановлена в значення 18. Ця установка відповідає ...

Скачать
28806
1
17

... сть у користуванні та невеликі розміри виконавчого файлу.. Створена нами програма проста та інтуїтивно зрозуміла і легка у користуванні. У пояснювальній записці вповні розглянута проблема пошуку коренів нелінійних рівнянь, наведені необхідні формули та теореми. Крім того, побудовані блок-схеми алгоритмів основних функцій відповідають діючим стандартам і вимогам. Отже, можемо зробити висновок, ...

0 комментариев


Наверх