6. ПІДПРОГРАМИ
6.1.
Скласти алгоpитм обчислення добутку
p=f0*f1*...*fn,
де
fl=
Вказівка. Викоpистати для обчислення fl функцію Sum_drob
у вигляді
функція
Sum_drob (l:нат):дійсн це
змін
і:нат;
m:ціл;
s:дійсн;
поч
s¬0; m¬ l*l;
для
i¬ 0 до
l повт
s¬s+1.0/(m+i+1)
кц;
Sum_drob¬S
кф;
6.2. Два пpостих числа
називаються "близнюками", якщо вони відpізняються один від одного на 2 (напpиклад, числа 41 та 43). Скласти алгоpитм виведення на друк всіх паp "близнюків" з відpізку [n,2*n], де n - задане ціле число, яке більше 2.
6.3. Дано натуральне число n та послідовність натуральних
чисел a1, a2, …, an. Показати всі елементи послідовності, які є
а)
повними квадратами;
б)
степенями п’ятірки;
в)
простими числами.
Визначити відповідні функції для перевірки, чи є число:
повним квадратом, степенню п’ятірки, простим числом.
6.4. Дано натуральне число n. Для чисел від 1 до n визначити всі такі, які
можна представити у вигляді суми двох повних квадратів. Описати функцію, яка перевіряє, чи є число
повним квадратом.
6.5. Дано парне число n>2. Перевірити
для нього гіпотезу Гольдбаха, яка полягає в тому, що кожне парне число n>2 можна представити у
вигляді суми двох простих чисел. Визначити функцію, яка перевіряє, чи є число
простим.
6.6. Скласти алгоритм
обчислення величини
для заданого дiйсного числа a>0. Визначити функцiю обчислення коренiв з
точнiстю e за наступною iтерацiйною схемою
,
взявши за вiдповiдь наближення , для якого e.
6.7. Використовуючи функцiю y=arctg(x), скласти пiдпрограму для обчислення функцiї, заданої спiввiдношенням
6.8. Скласти
алгоритм обчислення значень функцiї f(x), перiодичної з перiодом 1 i визначеної на всiй
числовiй вісi. Графiк функцiї зображено на малюнку 6.1
Мал. 6.1 - Графік періодичної функції
до завдання 6.7.
Якi
допомiжнi пiдпрограми будуть потрiбнi для розв'язку задачi ?
6.9. Визначити функцiю для
обчислення елiптичного iнтегралу
який, як показав Гаусс , рiвний границi монотонно-збiжних послiдовностей an i bn, які визначаються рекурентними спiввiдношеннями
Вказана границя називається арифметико-геометричним
середнiм чисел a i b.
Вказiвка.При виборi умови повторення циклу врахувати , що
6.10. Визначити функції для обчислення
а)
синуса ; б) косинуса
використовуючи їх розклади в ряд Тейлора.
6.11. Дано координати вершин трикутника і точки всередині його.
Використовуючи функцію для обчислення площі трикутника через три його сторони,
визначити відстань від даної точки до найближчої сторони трикутника.
Вказівка.Врахувати що площа трикутника обчислюється
також через основу і висоту.
6.12. Скласти функцію
перевірки заданого рядка на симетричність.
Скласти функцію для побудови інверсії
заданого рядка.
Розв`язок.
функція
Інв(S: рядок): рядок це
змін A: рядок;
поч
A¬’’;
поки len(S)>0 повт
A
¬ add(A, hd(S));
S ¬ tl(S)
кц;
Інв
¬ A
кф;
6.13. Перевірити, чи є даний рядок ідентифікатором,
натуральним числом, чи ні тим ні іншим. Скласти функції, які визначають чи є
заданий символ літерою та чи є даний символ цифрою.
6.14. Скласти функцію, яка визначає
позицію першого (останнього) входження заданого символа в заданий рядок.
6.15. Cкласти процедуру, яка замiнює в початковому рядку символiв всi одиницi на нулi, а всi нулi - на одиницi. Замiна повинна виконуватись, починаючи з заданої позицiї рядка.
6.16. Скласти процедуру, в результатi звернення до якої з першого заданого рядка видаляється
кожний символ, який належить i другому
заданому рядку.
6.17. Скласти підпрограму для обчислення значення натурального
числа за заданим рядком символів, який є записом
цього числа у системі числення за основою b (2<b<16). Використати функцію, яка за
заданим символом повертає відповідну цифру у системі числення за основою b.
6.18. Скласти підпрограму для отримання за заданим натуральним
числом рядка символів, який є записом цього числа у системі числення за основою b (2<b<16). Використати функцію, яка за
заданою цифрою у системі числення за основою b повертає символ, що відповідає цій цифрі.
6.19. Скласти алгоритм додавання „у
стовпчик” двох чисел, записаних у вигляді рядків, що є позиційними записами цих
чисел у десятковій системі числення. Використати підпрограми:
1) функцію GetDigit(c) отримання цифри за символом c;
2) функцію GetSymbol(d) отримання символа за цифрою d;
3)
процедуру AddDigit(n1, n2, p, n) додавання двох цифр n1, n2 з урахуванням
перенесення p та отримманням останньої цифри
результату n;
4) функцію
додавання двох рядків у стовпчик AddColumn(S1, S2).
6.20. Скласти алгоритм множення „у
стовпчик” двох чисел, записаних у вигляді рядків, що є позиційними записами цих
чисел у десятковій системі числення. Використати підпрограми:
1) функцію GetDigit(c) отримання цифри за символом c;
2) функцію GetSymbol(d) отримання символа за цифрою d;
3)
процедуру MulDigit(n1, n2, p, n) множення двох цифр n1, n2 з урахуванням
перенесення p та отримманням останньої цифри результату n;
4)
підпрограму MulStrChar(S, c) множення рядка S на символ c;
5)
підпрограму AddString(S1, S2, n) додавання двох рядків у
стовпчик зі „зсувом” другого рядка на n позицій ліворуч.
6.21. Скласти процедуру "стискання"
рядка: кожний пiдрядок, який складається
з кiлькох входжень одного i того ж символа,
замiнюється самим цим символом.
6.22. Скласти процедури, які виділяють
1) перше слово рядка, залишаючи рядок
без першого слова;
2) n-те слово рядка.
Використати
одну з цих процедур для
а)
підрахунку кількості слів рядка;
б)
отримання найдовшого слова;
в)
отримання найкоротшого слова;
г)
отримання всіх слів, які є паліндромами (симетричними);
д)
отримання всіх слів, які є ідентифікаторами;
д)
отримання всіх слів, які є натуральними числами.
6.23.
Скласти рекурсивнi пiдпрограми для обчислень значень функцiй
а)
б)
в)
г)
6.24. Скласти рекурсивну функцiю для обчислення
многочленiв Ермiта (див. завдання 3.15 б) з теми 3.2. „Програмування
рекурентних співвідношень”) i порiвняти
кількість дій у рекурсивному та
нерекурсивному варiантах.
6.25. Визначити рекурсивну функцiю обчислення НСД(n,m) натуральних чисел, яка грунтується на
спiввiдношеннi НСД(n,m)=НСД(m,r), де r - остача вiд дiлення n
на m.
6.26. Визначити рекурсивну процедуру
представлення натурального числа Z у вiсiмковiй системi числення.
Розв'язок. Переведення числа Z у вiсiмкову систему числення здiйснюємо шляхом дiлення
його на 8 i виведення залишкiв вiд дiлення у зворотнiй послiдовностi:
процедура Convert(Z:цiл) це
поч
якщо
Z>1 то Convert(Z div 8);
показати(Z mod 8)
кп.
6.27. Визначити рекурсивну функцiю обчислення степеня дiйсного числа з цiлим показником xn згiдно з формулою
6.28. Визначити рекурсивну функцiю для обчислення бiномiального коефiцiенту
, за такою формулою:
,
при 0<m<n.
6.29. Визначити рекурсивну функцiю для знаходження
суми додатнiх дiйсних чисел, якi складають непорожню послiдовнiсть, за якою
слiдує вiд'ємне число.
6.30. Визначити рекурсивну функцiю для обчислення числа Фiбоначчi Fn для заданого натурального n (див. завдання 10 з теми “Арифметичний цикл”).
Порiвняти працемісткість рекурсивного i
нерекурсивного варiантiв.
6.31.
Задані натуральнi числа a,c,m. Визначити рекурсивну функцiю для обчислення f(m) за формулою
,
g(m) - остача вiд дiлення a*n+c на
10.
Розв'язок.
функцiя F(a,c,m:нат):нат
це
змiн
z,y:нат;
поч
якщо (m<=9) & (m>=0) то
y
¬ m
iнакше
z
¬ (a * n+c) mod 10; y ¬ z*F(a,c,m-1-z)+m
кр;
F
¬ y
кф;
6.32.
Визначити рекурсивнi функцiї
а)
перевiрки заданого рядка на симетричнiсть;
б)
побудови рядка, iнвертованого по вiдношеню до заданого;
в) замiни у вихiдному рядку всiх входжень даного символа
даним рядком;
г)
перевiрки, чи є один рядок початком iншого;
д) перевiрки на входження
одного рядка у iнший.
Вказiвка. Нехай L, А, В Î W (L - порожній рядок), х,у Î Ch.
Для
побудови рекурсивних функцiй використати спiввiдношення
а) сим(L) = Іст, сим(add(х, L) = Іст,
сим(app(add(х, А), у)) = (х=у)
& сим(А);
б) інв(L) = L,
інв(add(х, А) = app(інв(А), х);
в) зам(L, х, В) = L,
зам(add(у, А), х, В) = add(у, зам(А, х, В)),
зам(add(х, А), х, В) = В+зам(А, х, В);
г) поч(L, В) = Іст, поч(add(x, А), L) = Хиб,
поч(add(х, А), add(у, В)) = (х = у) & поч(А, В);
д) вход(L, В) = Іст, вход(add(х, А), L) = Хиб,
вход(add(х, А), add(у, В)) = поч(add(х, А), add(у, В))Úвход(add(х, А), В).
Розв`язок в) Виходячи з наведених спiввiдношень, функцiю замiни побудуємо таким чином
функцiя Zam(А: рядок; х: симв; В: рядок): рядок це
поч
якщо
len(А)=0 то Zam ¬ А
iнякщо
hd(A) = х то Zam ¬ В+Zam(tl(А), х, В)
iнакше Zam ¬ add(c, Zam(tl(А), х, В)) кр
кф;
6.33. Скласти рекурсивну функцiю для обчисленя
функцiї Аккермана Акк(n,m),
заданої спiввiдношенням
Акк(0,m)=m+1;
Акк(n,0)=Акк(n-1,1);
Акк(n,m)=Акк(n-1,Акк(n,m-1)).
Обчислити
Акк(0,5),Акк(1,2),Акк(2,2).
Розв`язок.Обчислимо функцiю Аккермана за допомогою рекурсивної функцiї
функцiя Акк(N,M:нат):нат
це
змiн
Y:нат;
поч
якщо
N=0 то
Y¬ М+1
iнякщо
М=0 то
Y¬ Акк(N-1,1)
iнакше
Y¬ Акк(N,М-1);Y¬ Акк(N-1,Y)
кр;
Акк¬ Y
кф;
Покажемо
спосiб обчислення функцiї Аккермана на прикладi:
Акк(1,2)=Акк(0,Акк(1,1))=Акк(0,Акк(0,Акк(1,0)))=
Акк(0,Акк(0,Акк(0,1)))=Акк(0,Акк(0,2))=Акк(0,3)=4.
6.34.
Скласти алгоритм обчислення суми:
...
6.35. Ханойськi вежі. Дошка має три стрижні. На перший нанизано N дискiв спадного догори
дiаметра. Потрiбно, перекладаючи
диски по одному, розмiстити їх в початковому
порядку на другому стрижнi. При цьому
бiльший диск нiколи не повинен розмiщуватись над меншим.
Скласти
пiдпрограму, яка iлюструє порядок
перемiщення дискiв. Викликати її при
N=3.
Підрахувати кiлькiсть ходiв, які потрiбнi для перемiщення дискiв. Знайти її залежнiсть вiд N.
Розв`язок. Припусимо, що ми вмiємо переносити N-1 диск. Тодi правило перемiщення N дискiв iз стрижня А на стрижень В з використанням стрижня С для тимчасового зберігання дискiв можна записати таким чином:
1)перенести N-1 диск з А на С;
2)перенести 1 диск з А на В;
3)перенести N-1 диск з С на В.
Очевидно алгоритм має зміст при N>1. Одержуємо
рекурсивну процедуру
процедура Ханой(арг N,А,В,С:нат) це
поч
якщо
N>0 то
Ханой(N-1,А,С,В);
показати(А,`® `,В);
Ханой(N-1,С,В,А)
кр
кп.
яку можна
викликати так: Ханой(N,1,2,3).
При N=3
одержимо 1® 3, 1 ® 2, 3® 2, 1® 3, 2® 1, 2® 3, 1® 3.
Кiлькiсть
ходiв, потрiбних для перемiщення 3 дискiв, дорiвнює 7, для N дискiв -
6.36. Скласти алгоритм, який вiдображає всi перестановки цiлих чисел вiд 1 до N.
Вказiвка. Множину перестановок цiлих чисел вiд 1 до N можна отримати з множини всiх перестановок цiлих чисел вiд 1 до N-1, вставляючи N в усi можливi позицiї в кожнiй перестановцi.