Тема уроку: "Поняття рекурсії.
Розв'язування задач на складання алгоритмів з використанням рекурсії."
Тип уроку: Практичний.
Чи траплялось Вам колись зазирнути у дзеркало, напроти якого стоїть таке саме
дзеркало? Не правда дивна картина? В першому дзеркалі ми побачимо відображення
із протилежного дзеркала, в якому, в свою чергу, видно зображення першого
дзеркала і т.д. Коли скінчиться цей процес? А жартівливий віршик "У попа
була собака..."?
В математиці часто зустрічаються такі розрахунки, коли наступне значення величини
обчислюється через попереднє. Наприклад, для того, щоб обчислити значення
степеню x^n необхідно знати значення x^(n-1), для чого в свою чергу необхідно
знати значення x^(n-2) і т.д. Якщо спробувати запрограмувати цей процес, не
порушуючи логіку міркувань та оформлюючи його підпрограмою (наприклад, функцією),
нам прийдеться для обчислення значення xn викликати функцію обчислення степеню
x^(n-1) і помножити це значення на величину х. Тобто ми приходимо до такого
явища, як виклик підпрограми в середині самої підпрограми.
Рекурсією називається така ситуація, коли підпрограма (процедура або
функція) викликає сама себе.
Типова конструкція рекурсивної процедури повинна мати наступний вигляд:
Procedure Rec (t:integer); Begin <Дії на початку рекурсії> If <Перевірка умови> Then Rec(t+1); <Дії на виході з рекурсії> End;Саме головне при написанні рекурсії усвідомити, як правильно задати умову, яка буде заглиблювати нас у рекурсію або, навпаки, виводити з неї.
Постає питання, коли і як припинити цей процес? В даному випадку зупинкою для обчислень буде обчислення x0, так як відомо, що нульова степінь будь-якого числа дорівнює 1. Тобто рекурсивна функція для обчислення степеня числа буде мати наступний вигляд:
Function Step(x:real; n:integer):real: Begin If n = 0 then Step:=1 else Step:=Step(x,n-1)*x; End;Проаналізуємо роботу цієї функції на прикладі знаходження значення 23. При першому виклику функції значення змінних буде дорівнювати відповідно:
Тоді вихідна програма буде мати наступний вигляд:
Program Example_440; Uses crt; {Підключення бібліотеки} Function Factorial (n:integer):longint; Begin if n=0 then Factorial:=1 else Factorial:=Factorial(n-1)*n; End; Var Rez:longint; i:byte; Begin Clrscr; Rez:=0; For i:=1 to 10 do begin Rez:=Rez+Factorial(i); end; writeln('Rezultat -> ',Rez); Readkey; End.
Задача № 495.
Умова: Знайти найбільший спільний дільник двох натуральних чисел n
та m за алгоритмом Евкліда:
В даному випадку умовою виходу з рекурсії буде рівність двох чисел n=m.
Написання самої програми, на наш погляд, являється тривіальним:
Program Example_495; Uses crt; {Підключення бібліотеки} Function Evklid (n,m:integer):integer; begin if n=m then Evklid:=n else if n>m then Evklid:=Evklid(n-m,m) else Evklid:=Evklid(n,m-n); end; Var x,y:integer; Begin Clrscr; writeln ('Введіть два числа: '); readln (x,y); writeln ('НОД -> ',Evklid(abs(x),abs(y))); Readkey; End.
Задача № 498.
Умова: Обчислити значення функції Аккермана для двох невід'ємних
цілих чисел n та m, де:
На наш погляд, реалізація запропонованої рекурсивної функції являється тривіальною,
тому наводимо текст програми без пояснень:
Program Example_498; Uses crt; {Підключення бібліотеки} Function A(n,m:word):word; Begin if n=0 then A:=m+1 else if (n<>0) and (m=0) then A:=A(n-1,1) else A:=A(n-1,A(n,m-1)); End; Var x,y:word; Begin Clrscr; writeln ('введіть два числа: '); readln (x,y); writeln ('Результат обчислень -> ',A(x,y)); Readkey; End.
Задача № 500.
Умова: Обчислити кількість комбінацій з n різних елементів
по m, тобто кількість неупорядкованих підмножин з m елементів,
що належать заданій множині з n елементів , скориставшись залежністю:
Програма, що виконує запропонований алгоритм, має наступний вигляд:
Program Example_500; Uses crt; {Підключення бібліотеки} Function C (n,m:word):longint; Begin if ((m=0) and (n>0)) or ((m=n) and (n>=0)) then C:=1 else if (m>n) and (n>=0) then C:=0 else C:=C(n-1,m-1)+C(n-1,m); End; Var x,y:word; Begin clrscr; writeln ('Введіть два числа: '); readln(x,y); writeln ('Кількість комбінацій з ',x,' по',y,' -> ',C(x,y)); readkey; End.