Uploaded by oldtownroadukr

Лабораторна робота N 3 (1)-5

advertisement
Лабораторна робота № 3
РЕКУРСИВНІ АЛГОРИТМИ
1. Мета роботи
Отримати практичні навички у розробці рекурсивних програм
2. Теми для попереднього вивчення
•
•
•
Масиви;
Лінійні списки;
Рекурсивні алгоритми.
3. Постановка задачі
Загальні відомості
Рекурсивним називається об’єкт, який частково утворений або визначений за
допомогою самого себе.
Рекурсивною функцією можна задати нескінченне обчислення, причому така
функція не буде містити явних повторень. Тому необхідно забезпечити
закінчення її роботи. Найбільш надійний спосіб – ввести в неї будь-який
параметр (назвемо його n) і при рекурсивному звертанні до Р у якості
параметра задавати n-1. Якщо в цьому випадку в якості умови використати
n>0, то закінчення алгоритму гарантоване. Ця ідея може бути виражена
двома схемами:
P(n) ≡ if n>0 then P[S,P(n-1)]
або
P(n) ≡ P[S, if n>0 then P(n-1)].
Рекурсій слід уникати там, де є очевидний ітераційний спосіб розв’язування
задачі.
4. Індивідуальні завдання
Розробити рекурсивний алгоритм розв’язання індивідуального завдання.
Завдання
варіант
1
Функція Акермана A(m,n) названа в честь німецького математика і
використовується в теорії обчислень. Визначається для всіх
додатних цілих аргументів m та n так:
A(0,n)=n+1;
A(m,0)=A(m-1,1);
(m>0)
A(m,n)=A(m-1,A(m,n-1)); (m>0,n>0)
Обчислити значення функції A(m,n) для значень m і n, що
вводяться з клавіатури
2
Знайти всі n! перестановок для n елементів a1…an, та вивести їх на
екран. Число n та самі числа, які переставляються, ввести з
клавіатури
1
3
4
5
6
Алгоритм переведення числа N з десяткової системи числення в
систему за основою B полягає в багатократному діленні N на B.
Якщо N = dn-1 dn-2 dn-3 … d1 d0, то послідовність остач від ділення в
порядку d0 ... dn-1 дає цифри результату перетворення. Розробити
функцію, що перетворює число N в систему обчислення B,
припустити умову B<=10
Числа Фібоначчі F(n) названі в честь математика Леонардо
Пізанського (відомого як Фібоначчі) і визначаються так:
F(0)=0;
F(1)=1;
F(n)=F(n-1)+F(n-2); (n>1)
Для заданого n визначити усі числа Фібоначчі з інтервалу від 0 до n
Розробити програму для визначення розміру платежів за позикою у
розмірі $100000 під 10% річних на 20 років
Для заданих x та n визначити значення функції
P( x) = x +
7
x3 x5 x7
x 2 n+1
+ + + .. +
3! 5! 7!
(2n + 1)!
Числа Каталана названі в честь бельгійського математика. Задають
кількість способів з'єднати 2n точок на колі n хордами, які не
перетинаються або кількість розбиттів опуклого (n+2)-кутника на
трикутники діагоналями, що не перетинаються. Числа задаються
таким співвідношенням:
C(0)=1;
C(n)=C(0)C(n-1)+C(1)C(n-2)+…+C(n-2)C(1)+C(n-1)C(0); (n>0)
8
9
10
11
Підрахуйте значення числа C(n) для n, яке вводиться з клавіатури
Обчислити найбільший спільний дільник чисел a і b,
використовуючи алгоритм Евкліда. Числа a і b ввести з клавіатури
Ввести масив з n додатних цілих чисел. Визначити, чи можна з цих
чисел вибрати такі, щоб їх сума дорівнювала числу s. Якщо варіант
існує, то вивести результат на екран. Всі числа вводити з
клавіатури.
Приклад, вхідні дані: 7,5,4,1; s=10; Результат: 10=5+4+1
Числа трибоначчі T(n) визначаються так:
T(0)=0;
T(1)=0;
T(2)=1;
T(n)=T(n-1)+T(n-2)+T(n-3); (n>2)
Для заданого n визначити числа трибоначчі з інтервалу від 0 до n.
Назва є варіацією назви «чисел Фібоначчі» – з доданням «три» (лат.
tri-), що позначає кількість чисел, які додаються
Розробити програму, що визначає кількість n-розрядних двійкових
2
чисел, які не мають у собі підряд двох одиниць. (Підказка: число може
починатись з нуля або одиниці. Якщо число починається з нуля, то кількість
варіантів визначається наступними (n-1) цифрами. А якщо число починається
з одиниці, то якою повинна бути наступна цифра?)
12
13
14
15
16
17
18
19
20
Числа Делануа D(a,b) названі в честь французького математика і
описують кількість шляхів з лівого нижнього кута прямокутної ґратки
розміром (a,b) в протилежний по діагоналі кут, використовуючи
лише ходи вгору, вправо або вгору-вправо («ходи короля»). Числа
задаються таким співвідношенням:
D(0,n)=1;
D(m,0)=1;
D(m,n)=D(m-1,n)+D(m-1,n-1)+D(m,n-1); (m>0,n>0)
Напишіть функцію обчислення чисел Делануа. Знайдіть число
D(m,n) для значень m і n, введених з клавіатури
Обчислити значення числа an. Значення a та n ввести з клавіатури
Розкласти натуральне число a типу на прості множники
Числа Леонардо L(n) названі в честь математика Леонардо
Пізанського (відомого як Фібоначчі) і визначаються так:
L(0)=1;
L(1)=1;
L(n)=L(n-1)+L(n-2)+1; (n>1)
Для заданого n визначити усі числа Леонардо з інтервалу від 0 до n
Задано текст (ланцюжок символів). Змінити послідовність ланцюжка
символів, що починається з індекса m і закінчується індексом n, на
зворотну послідовність
Числа Моцкіна M(n) названі в честь американського математика і
задають кількість способів з'єднати n точок на колі хордами, які не
перетинаються. Числа задаються таким співвідношенням:
M(0)=1;
M(1)=1;
M(n)=M(n-1)(2n+1)/(n+2)+M(n-2)(3n-3)/(n+2); (n>1)
Знайдіть значення числа M(n) для n, введеного з клавіатури
Задано текст (ланцюжок символів). Перевірити, чи послідовність
символів, яка починається з індекса m і закінчується індексом n, є
паліндромом (однаково читається в прямому і зворотному напрямку.
Наприклад, депомитимопед)
Числа Люка L(n) названі в честь французького математика і
визначаються так:
L(0)=2;
L(1)=1;
L(n)=L(n-1)+L(n-2); (n>1)
Для заданого n визначити усі числа Люка з інтервалу від 0 до n
Потрібно оплатити поштове відправлення, вартість якого складає n
3
21
22
23
копійок, а в наявності тільки поштові марки номіналом x, y, z
копійок. Скількома різними способами можна оплатити поштове
відправлення? Розробити рекурсивну функцію для обчислення
кількості зображень числа n у вигляді суми певних фіксованих
чисел з використанням рекурентних співвідношень.
Підказка. Використати рекурентне співвідношення для чисел
Фібоначчі.
Коефіцієнти, що утворюють трикутник Паскаля, визначаються так:
C(n,0)=1;
C(n,n)=1;
(n>0)
C(n,k)=C(n-1,k-1)+C(n-1,k); (n>0,0<k<n)
Розробити програму, що для заданого n будує трикутник Паскаля
Ввести два масиви розмірності m і n, елементи яких впорядковані за
зростанням. Розробити програму злиття цих масивів в один масив,
впорядкований за зростанням
Створити дві множини A і B однакового розміру n з цілими
додатними числами, що не перетинаються (масиви з різними
елементами). Знайти всі пари <a,b> з n вихідних пар, таких, що a
належить до A і є парним числом, більшим за 10 і b належить B і є
непарним числом, кратним 5
5. Приклад виконання
5.1. Індивідуальне завдання:
Обчислити значення функції f=xn.
5.2. Текст програми
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
int power(int x, int n); //
Повертає х в степені n (n>=0)
int main(void)
{
setlocale(LC_ALL, "Ukrainian");
// для роботи з кирилицею
int x, n;
printf("Введiть число x: \n");
cin >> x;
printf("Введiть степiнь n: \n");
cin >> n;
cout <<x<< " в степенi " <<n<< " дорiвнює " <<power(x, n)<< endl;
_getch();
return 0;
}
4
int power( int x, int n)
{
if (n<0)
{
cout <<"Неприпустимий аргумент функцiї power \n";
_getch();
exit(1);
}
if (n>0) return power(x, n-1)*x;
else return 1; // n == 0
}
5.3. Результат роботи програми
Введiть число x:
11
Введiть степiнь n:
3
11 в степенi 3 дорiвнює 1331
5
Download