Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
samost_pascal_delphi_2012.doc
Скачиваний:
0
Добавлен:
04.01.2020
Размер:
4.33 Mб
Скачать

Завдання 13:

  1. Сформувати геометричну прогресію, що зростає, з 4 елементів: початкове значення – 5, крок – 3 (використання операції множення); та обчислити добуток її елементів.

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

Рекурсією називається алгоритмічна конструкція, де підпрограма викликає сама себе. Рекурсія дає можливість записувати циклічні алгоритми, не використовуючи операторів циклу. Застосовуючи рекурсію, потрібно правильно складати стоп-умову, яка забезпечує закінчення рекурсивних обчислень.

Розглянемо поняття стека. Стек це модель оперативної пам’яті (структура даних), де дані запам’ятовуються і зберігаються за принципом «перший прийшов —. Останній пішов». Аналогом у військовій справі є ріжок для патронів до автомата.

Пример1. Рекурсивна функція обчислення суми цілих чисел від а до b має вигляд

function Summa(а, b : integer): integer;

begin

if а = b then Summa := а (Це стоп-умова рекурсії}

else Summa := b + Summa(а, b-1) {Це неявний цикл}

end;

Обчислимо функцію Summa(3, 5). Формально можна записати

Summa(3, 5)= 5 + Summa(3, 4)= 5 + 4 + Summa(3, 3)= 5 + 4 + 3.

Система виконує такі обчислення за два етапи: на першому етапі формує стек, куди заносить числа 5, 4, 3. На другому етапі числа додає в зворотній послідовності (оскільки вони поступають із стека): 3 + 4 + 5 = 12.

Приклад2. Скласти рекурсивну функцію Factorial для обчислення факторіалу числа n (n! = 1* 2* 3* … n, 0! = 1,1! = 1), яка обчисляє його на багаторазовому (рекурсивному) використанні формули n! = n* (n – 1)!.

Function Factorial(n : integer): integer;

begin

if n = 0 then Factorial := 1 {Це стоп-умова}

else Factorial := n * Factorial(n-l)

end;

Обчислимо 4!:

Factorial(4)= 4 • Factorial(3)= 4 • 3 • Factorial(2)=

= 4 • 3 • 2 • Factorial(l)= 4 • 3 • 2 • 1 • Factorial(O)=

= 4 • 3 • 2 • 1 • 1.

У стек будуть занесені числа 4, 3, 2, 1, 1. Отже отримаємо результат: 1 • 1 • 2 • 3 • 4 = 24.

Завдання 14:

  1. Написати рекурсивну функцію обчислення значень функції Аккермана для додатних чисел n и m, введених з клавіатури.

M+1, якщо n=0

A(n,m) = A(n-1,1), якщо n≠0, m=0

A(n-1,A(n,m-1)), якщо n>0, m≥0

  1. Знайти перші N чисел Фібоначчі. Кожне число Фібоначчі, за виключенням перших двух, дорівнює сумі двох предыдущих чисел, а перші два дорівнють 1. (1, 1, 2, 3, 5, 8, 13, 21…)

1, если n=1 или n=2

Ф(n)= Ф(n-1) + Ф(n-2), если n>2

  1. Знайти суму перших N членів арифметичної (геометричної) прогресії.

Задачі, з постановки якиїх можна витягнути рекурсію.

У формулюваннях деяких завдань рекурсія не присутня у явному вигляді, але їх можна звести до рекурсивних.

Приклади:.

  1. Складання двох чисел. Нехай потрібно скласти два цілі числа a і b, а можна тільки додавати або віднімати 1. Тоді:

якщо b=0, то a+b=a

якщо b>0, то a+b=(a+1)+(b-1)

якщо b<0, то a+b=(a-1)+(b-1)

Це є рекурсивне визначення функції додавання двох чисел.

Function Sum(a, b : integer) : integer;

begin

if b=0 Then Sum:=a

else if b>0 Then Sum:=Sum(a+1, b-1)

else Sum:=Sum(a-1, b+1);

end;

  1. . Знайти НСД двох чисел.(2 способ) Маємо два натуральних числа a і b.

Якщо a=b, то НОД(a,b)=a.

Якщо a>b, то НОД(a,b)=НОД(a-b,b).

Якщо a<b, то НОД(a,b)= НОД(a,b-a).

Function NOD(a,b : integer) : integer;

begin

if a=b Then NOD:=a

else if a>b Then NOD:=NOD(a-b,b)

else NOD:=NOD(a,b-a) ;

end;

a

b

Примітки

123

36

Так як a>b, a:=a-b

87

36

a:=a-b

51

36

a:=a-b

15

36

Так як b>a, b:=b-a

15

21

b:=b-a

15

6

a:=a-b

9

6

a:=a-b

3

6

b:=b-a

3

3

Так як a=b, НСД:=a

  1. Перевести натуральне число із десяткової системи счисления у двійкову.

Function Rec(n: integer);

begin

if n>1 Then Rec(n div 2);

Write(n Mod 2);

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]