- •1.1.2 Структура функцій програми
- •1.1.3 Правила синтаксису
- •1.1.4. Типи даних
- •1.1.5. Функції введення та виведення даних
- •1.2 Приклад програми Умова задачі
- •Особливості використання функцій вводу та виводу
- •1.3 Технологія виконання лабораторної роботи
- •1.4. Варіанти завдань
- •1.5 Контрольні запитання
- •Розгалужені обчислювальні процеси Лабораторна робота 2
- •2.1 Теоретичні відомості
- •2.1.1. Вибір із двох альтернатив
- •2.1.2. Вкладеність конструкцій вибору
- •2.1.3. Операторний блок
- •2.1.4. Поліваріантний вибір
- •2.2. Приклади програм
- •2.3. Варіанти завдань
- •2.4 Контрольні запитання
- •Циклічні обчислювальні процеси Лабораторна робота 3
- •3.1 Теоретичні відомості
- •3.1.1. Цикл із передумовою
- •3.1.2. Цикл із постумовою
- •3.1.3. Цикл із лічильником
- •3.1.4. Переривання та продовження циклу
- •3.2. Приклад алгоритму та програми
- •3.3. Варіанти завдань
- •3.4 Контрольні запитання
- •Цикли з розгалуженням Лабораторна робота 4
- •4.1 Теоретичні відомості
- •4.1.1. Рекурентні співвідношення
- •4.1.2. Функції користувача
- •4.2. Приклад алгоритму та програми
- •Алгоритм задачі
- •Код програми
- •4.3. Варіанти завдань
- •4.4 Контрольні запитання
- •Рекурсивні функції Лабораторна робота 5
- •5.1 Теоретичні відомості
- •5.2. Приклад алгоритму та програми
- •5.3. Варіанти завдань
- •6.1.2. Оголошення та ініціалізація
- •6.1.3. Операції над покажчиками
- •6.1.4. Методи розв’язанні нелінійних рівнянь
- •6.2. Приклад алгоритму та програми
- •6.3. Варіанти завдань
- •6.4 Контрольні запитання
- •Одновимірні масиви Лабораторна робота 7
- •7.1 Теоретичні відомості
- •7.2. Приклад алгоритму та програми
- •Алгоритм програми
- •Код програми
- •7.3. Варіанти завдань
- •7.4 Контрольні запитання
- •Багатовимірні масиви Лабораторна робота 8
- •8.1 Теоретичні відомості
- •8.1.1. Оголошення багатовимірних масивів. Доступ до елементів
- •8.1.2. Базові операції обробки двовимірних масивів
- •8.2. Приклад алгоритму та програми
- •8.3. Варіанти завдань
- •9.1.2. Деякі функції обробки рядків
- •9.2. Приклад алгоритму та програми
- •9.3. Варіанти завдань
- •9.4 Контрольні запитання
- •Структури та масиви структур Лабораторна робота 10
- •10.1 Теоретичні відомості
- •10.2. Приклад алгоритму та програми
- •Алгоритм задачі
- •Приклад коду
- •10.3. Варіанти завдань
- •10.4 Контрольні запитання
5.2. Приклад алгоритму та програми
Одним із найпростіших прикладів рекурсії – це функція обчислення факторіала. Нагадаємо, що факторіалом n! натурального числа n називається добуток усіх цілих чисел від одиниці до n. Вважають також, що 0!=1. Обчислення факторіала зводиться до багаторазового застосування рекурентної формули n! = (n 1)!· n. Ця формула є рекурсивною, оскільки означує «факторіал через факторіал». Рекурсивне обчислення n! низхідним: «обчислити (n – 1)! і отримане значення помножити на n». При обчисленні (n – 1)! застосоване те саме правило: «обчислити (n – 2)! і отримане значення помножити на n – 1». Рекурсія являє нескінченний цикл, для її переривання необхідно визначити умову завершення рекурсії. Такою умовою буде рівність n нулеві.
Повне рекурсивне означення факторіала:
//ex4_9.cpp. Обчислення факторіала числа #include<iostream> using namespace std; int x; //число, факторіал якого необхідно обчислити int Factorial(int n) //оголошення функції { if (n==0) return 1; else return Factorial(n-1)*n; //рекурсивний виклик функції } int main() //головна функція { cout<<"calculate factorial"<<endl; cout<<"Enter x "<<endl; cin>>x; cout<<"x!="<<Factorial(x)<<endl; system("pause"); }
5.3. Варіанти завдань
-
Знайти суму цифр натурального числа n та значення глибини рекурсії, використовуючи рекурентне означення функції f(n):
Підказка. Умова продовження рекурсії: сума цифр числа дорівнює останній цифрі плюс сума цифр числа без останньої цифри (числа, що ділиться без остачі на 10). Умова закінчення рекурсії: якщо число дорівнює 0, то сума його цифр дорівнює 0.
-
Знайти кількість одиниць в двійковому представленні числа n та значення глибини рекурсії, використовуючи рекурентне означення функції f(n) (& - операція побітового логічного множення):
-
Знайти значення біноміального коефіцієнта при заданих n, k за формулою:
= ,
використовуючи рекурентне співвідношення:
Визначити глибину рекурсії.
-
Знайти значення функції Аккермана A(m, n), використовуючи рекурентне співвідношення:
Визначити глибину рекурсії.
-
Визначити кількість розбиття додатного цілого числа та глибину рекурсії в рекурсивному алгоритмі. Розбиття цілого числа - це його зображення у вигляді суми цілих додатних чисел. Обчислити функцію , яка визначається як кількість розбиття цілого із доданками, що не перевищують значення . Функція визначається за рекурентним співвідношенням:
-
По колу стоять людей, яким присвоєні номери від 1 до . Починаючи відлік з першого і рухаючись по колу, кожна друга людина виходитиме з кола доти, поки не залишиться одна. Нехай номер того, хто залишився, . Потім по колу стоятиме людей і процедура виходу з колу людей повторюватиметься доти, поки не залишиться одна людина з номером . Ці процедури повторюватимуться доти, поки номер тої людини, що залишиться, не стане рівним первинній кількості людей в потоковому раунді. Визначити кількість повторень процедури виходу людей з кола після першої ітерації та номер людини, яка залишилася.
Підказка. Використати рекурсію, визначивши рекурентне співвідношення:
-
Визначити рекурсивні функції зображення натурального числа у двійковій, вісімковій системах числення та у системі числення з основою N > 1 та глибину рекурсії. Числа у десятковій системі числення вводити з клавіатури.
-
Визначити рекурсивну функцію обчислення найбільшого спільного дільника НСД{п,т) натуральних чисел, яка ґрунтується на співвідношенні НСД(п,т) = НСД(т,r), де r -залишок від ділення п на т.
-
Визначена рекурсивна функцію через рекурентне співвідношення:
Визначити глибину рекурсії та обчислити функції за заданими значеннями :
-
Визначити рекурсивну функцію обчислення степеня дійсного числа з цілим показником , згідно з рекурентним співвідношенням:
-
Коефіцієнти розкладання бінома (a+b)i, тобто біноміальні коефіцієнти, утворюють і-й рядок трикутника Паскаля. Кожне число в трикутнику, крім перших трьох, є сумою чисел, розташованих над ним у попередньому рядку. Число в i-му рядку (i = 0, 1, 2, …) на j-му місці (j = 0, 1, …, i), задається формулою . «Верхівка» трикутника має наступний вигляд.
Надрукувати перші рядків трикутника Паскаля із заданою кількістю рядків, використавши рекурсивне визначення його елементів.
-
Написати рекурсивну функцію, яка методом ділення відрізання навпіл (методом дихотомії) знаходить з точністю корінь рівняння на відрізку (). Згідно з методом дихотомії, якщо i мають різні знаки, то між точками існує корінь . Нехай – середня точка в інтервалі . Якщо , то корінь . Якщо , то або і мають різні знаки, або і мають різні знаки. Якщо , то корінь лежить в інтервалі Інакше він лежить в інтервалі Процес продовжується доти, поки інтервал не стане менший . Визначити глибину рекурсії під час обчислення кореня рівняння.
-
Реалізувати генератор послідовності псевдовипадкових чисел {Vi} на основі рекурентного співвідношення Vi = (aVi–1 + bVi–2 + c) mod m, де a, b, c, m — довільні натуральні параметри. Перші два значення, V1 і V2, задаються випадково. Підібрати значення параметрів, за яких послідовність є схожою на випадкову.
-
Довести, що для перших чисел послідовності Фібоначчі справедлива формула: ,
де - біноміальні коефіцієнти, що розраховуються за рекурентним співвідношенням:
Числа Фібоначчі визначаються рекурентним співвідношенням:
-
Для числа, що введено з клавіатури, визначити рекурсивні функції для обчислення суми та кількості його цифр, максимальної та мінімальної цифри. Визначити рекурентні співвідношення та глибину рекурсії.
-
Задати з клавіатури перший член і різницю арифметичної прогресії. Визначити рекурсивні функції для знаходження -го члена арифметичної прогресії та суми її членів. Визначити рекурентні співвідношення та глибину рекурсії.
-
Задати з клавіатури перший член і знаменник геометричної прогресії. Визначити рекурсивні функції для знаходження -го члена геометричної прогресії та суми її членів. Визначити рекурентні співвідношення та глибину рекурсії.
-
Визначити добуток двох комплексних чисел . Вхідні значення – числа . Результат – числа . Використати рекурсивний алгоритм Карацуби.
Підказка. З алгоритмом Карацуби початкові операнди множення подаються як вирази , де для 32-бітних процесорів, визначається як половина розміру (в 32-бітових словах) мінімального по довжині множника. Таким чином, початкові множники розбиваються на молодшу і старшу частині. Після розбиття операндів виконується розрахунок проміжних значень:
Результуючий добуток розраховується за формулою:
Множення на здійснюється за допомогою зсуву, а підсумовування та за допомогою конкатенації. Метод Карацуби дозволяє звести операцію множення двох великих чисел до трьох множень чисел половинного розміру (в порівнянні з початковими операндами), п'яти операцій підсумовування і одного зсуву.
-
Потрібно сплатити поштове відправлення, вартість котрого складає копійок, а в наявності тільки поштові марки номіналом копійок. Скількома різними способами можна сплатити поштове відправлення? Розробити рекурсивну функцію для обчислення кількості зображень числа у вигляді суми певних фіксованих чисел з використанням рекурентних співвідношень.
Підказка. Використати рекурентне співвідношення для чисел Фібоначчі.
-
Довести, що рекурсивна послідовність
має межу при і знайти значення цієї межі. Визначити глибину рекурсії під час розрахунку.
-
Задані натуральні числа а, c, m. Визначити рекурсивну функцію та глибину рекурсії для обчислення за формулою:
, де
- залишок від ділення на 10.
-
Двійкові числа довжини складаються з нулів і одиниць. Нехай – функція, значенням якої є кількість двійкових чисел довжини , що не містять двох або більше одиниць поспіль. Визначити рекурентне співвідношення, яке задає функцію , надрукувати такі числа, підрахувати їх кількість.
-
По заданим b, p, m обчислити значення виразу . Обчислення виконати, використовуючи алгоритм, що базується на двійковому розкладанні показника степені p:
-
Функція f визначена так:
Обчислити значення , якщо
5.4 Контрольні запитання
-
Що таке рекурсивне визначення і рекурсивний об’єкт?
-
Визначити поняття рекурсії. Що таке рекурсивна підпрограма?
-
Як визначається глибина рекурсії?
-
Як обмежити послідовність вкладених викликів рекурсивної підпрограми?
-
Коли рекурсія неефективна і коли її необхідно уникати?
-
Чим викликається переповнення стеку під час рекурсії?
Покажчики Лабораторна робота 6
Мета роботи.
-
ознайомитися з особливостями посилальних типів даних;
-
опанувати технологію застосування посилальних типів даних;
-
навчитися розробляти алгоритми та програми із застосуванням посилальних типів даних.
6.1 Теоретичні відомості
6.1.1. Основні поняття
До посилальних типів відносяться покажчики та посилання. Покажчики дозволяють працювати з адресами комірок оперативної пам’яті, тим самим вони реалізують непрямий доступ до їх вмісту. Посилання є альтернативними іменами змінних. Застосування покажчиків і посилань як параметрів функцій дозволяє функції змінювати значення своїх аргументів, отже, повертати в програму більше ніж одне значення.
Змінні, що зберігають адреси інших змінних, називаються змінними-покажчиками чи просто покажчиками. Для визначення адреси змінної означена операція & отримання адреси. Якщо оголошена та ініціалізована змінна, наприклад, int value=10, її адресу можна визначити виразом &value. Якщо значення, що зберігаються, займатимуть послідовність байтів, покажчик адресує перший байт цієї послідовності.