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

Задачі, які можна розв’язати як окремий випадок узагальненої.

Якщо не можна витягнути рекурсію з постановки задачи, то можна розширити задачу, узагальнити її(наприклад, ввівши додатковий параметр). Вдале узагальнення може допомогти побачити рекурсію. Після цього повертаємося до окремого випадку і вирішуємо початкову задачу.

Приклад: Визначити, чи є задане натуральне число простим. Це завдання можна узагальнити, наприклад, так: визначити, чи вірно, що задане натуральне число N не ділиться ні на одно число, більше або дорівнює М(2≤M≤N), але менше N. Відповідна функція повинна набувати значення "істина" в двох випадках:

  • якщо M=N;

  • якщо N не ділиться на М і функція приймає значення «істина» для чисел М+1 і N.

Function Simple(m,n : integer): boolean;

begin

if m=n Then Simple:=True

else Simple:=(n Mod m <> 0) And Simple(m+1,n);

end;

Задачі, в яких можна використати характеристику або властивість функції.

Для заданого натурального числа N≥1 визначити натуральне число a, для якого виконується нерівність:2а-1 ≤ N < 2a.

A(N) = 1 , якщо N=1

a(N)=a(N div 2) + 1, якщо N>1

Розглянемо приклад. Нехай N=34.

2a-1≤34<2a, додаємо 1 і переходимо до 34 div 2

2a-1≤17<2a +1

2a-1≤ 8<2a +1

2a-1≤ 4<2a +1

2a-1≤ 2<2a +1

2a-1≤ 1<2a ; отримаємо а=1

А тепер повертаємося назад, до останньої одиниці додаємо всі попередні. Таким чином, виходить 6.

Function A(N : integer) : integer;

begin

if N=1 then a:=1 else a:=a (N div 2) +1;

end;

Відкриті масиви.

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

<ім’я масива>: array of <ім’я базового типа>

Нумерація елементів такого формального масиву в підпрограмі завжди починається з нуля. Номер останнього елементу можна визначити за допомогою стандартної функції

high(<ім’я масиву>).

Відкритий масив використовують для почергової обробки в процедурі масивів різних розмірів.

Приклад. Використовуючи підпрограми, створити масив, елементи якого задані формулою ут = fy(m) = random(m), т = 1, 2 …, 7, і масив g з елементами gn=fg(n)=n2/2, n= 1, 2 …, 9. У кожному масиві визначити кількість елементів, більших 4. Вивести на екран результати обчислень.

Program MyProcedure;

{$F+}

type myfunc = function(n : integer): real; var у : array [1..7] of real;

g : array [1..9] of real;

function fy(m : integer): real;

begin

fу := random(m)

end;

function fg(n : integer): real;

begin

fg := n * n / 2

end;

procedure Sozdat(f : myfunc; var z : array of real);

var i : integer;

begin

for i := 0 to high(z) do

begin

z[i]:= f[i + 1]; write(z[i]:5:2);

end;

writeln

end;

function kol(z : array of real): integer; var i, k : integer;

begin

k :=0;

for i := 0 to high(z) do

if z[i]> 4 then k := k + 1;

kol := k

end;

begin

randomize;

Sozdat(fy, у);

Sozdat(fg, g);

write(‘Кількість шуканих елементів у — ‘);

writeln(‘k = ‘, kol(y):3);

write(‘ Кількість шуканих елементів g – ‘);

writeln(‘k = ‘, kol(g):3);

end.

Зауваження. Зверніть увагу на використання типу даних функція (function):

type myfunc = function(n : integer): real.

До цього типу віднесені конкретні функції fy(x) і fg(x). Завдяки типу myfunc можна, використовуючи всього одну процедуру, створювати різні масиви. У зв’язку з цим в програму включена директива {$F+}, яка підтримує необхідну модель (far-модель) виклику підпрограм.

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