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

Тема 3.7. Рекурсія.

  1. Крива Гільберта.

  2. Пошук шляху.

  3. Пошук найкоротшого шляху.

1. Крива Гільберта.

Наступна|така| програма викреслює в діалоговому вікні криву Гільберта. На малюнку приведені криві Гільберта першого, другого і третього порядків|ладів|. Якщо придивитися|приглядатися|, то видно|показний|, що крива другого порядку|ладу| виходить шляхом з'єднання|сполучення| прямими лініями чотири кривих першого порядку|ладу|. Аналогічним чином виходить крива третього порядку|ладу|, але|та| при цьому як "цегла" використовуються криві другого порядку|ладу|. Так, щоб намалювати криву третього порядку|ладу|, треба намалювати чотири кривих другого порядку|ладу|. У свою чергу|своєю чергою|, щоб|аби| намалювати криву другого порядку|ладу|, треба намалювати чотири кривих першого порядку|ладу|. Таким чином, алгоритм викреслювання кривої Гільберта є|з'являється| рекурсивним.

Діалогове вікно програми Крива Гільберта, в якому знаходиться|перебуває| крива п'ятого порядку|ладу|, приведено на малюнку, текст програми – в лістингу.

 

Криві Гільберта першого, другого і третього порядків

Крива Гільберта п'ятого порядку

Лістинг. Крива Гільберта

unit gilbert_;

interface|

uses|

Windows|, Messages|, SysUtils|

Variants|, Classes|, Graphics|

Controls|, Forms|, Dialogs|, StdCtrls|, ComCtrls|;

type|

TForml| = class|(TForm|)

procedure FormPaint(Sender: TObject);

private|

{ Private| declarations| }

public|

{ Public| declarations| }

end|;

var|

Form1|: TForm1|;

implementation| {$R *.dfm}

var|

p: integer| =5; // порядок|лад| кривої

u: integer| =7; // довжина штриха

{ Криву Гільберта можна отримати|одержувати| шляхом|колією|

з'єднання|сполучення| елементів а,b,с| і d.

Кожен елемент будує

відповідна процедура. }

procedure а(i:integer; canvas: TCanvas); forward;

procedure b(i:integer; canvas: TCanvas); forward;

procedure с(i:integer; canvas: TCanvas); forward;

procedure d(i:integer; canvas: TCanvas); forward;

// Елементи кривої

procedure а(i: integer; canvas: TCanvas);

begin|

if| i > 0 then| begin|

d(i-l|, canvas|);

canvas|.LineTo(canvas|.PenPos.X+u,canvas.PenPos.Y);

а(i-l|, canvas|);

canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y+u);

а(i-l|, canvas|);

canvas|.LineTo(canvas|.PenPos.X-u,canvas.PenPos.Y);

с|із| (i-1|, canvas|);

end|;

end|;

procedure b(i: integer; canvas: TCanvas);

begin|

if i > 0 then begin

с|із|(i-l|, canvas|);

canvas|.LineTo(canvas|.PenPos.X-u,canvas.PenPos.Y);

b(i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y-u);

b(i-l|, canvas|);

canvas|.LineTo(canvas|.PenPos.X+u, canvas|.PenPos.Y);

d(i-l|, canvas|);

end|;

end|;

procedure з(i: integer; canvas: TCanvas);

begin|

if i > 0 then begin

b(i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y-u);

с|із| (i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X-u,canvas.PenPos.Y);

с|із|(i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y+u);

а(i-1|, canvas|);

end|;

end|;

procedure d(i: integer; canvas: TCanvas);

begin|

if i > 0 then begin

а(i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y+u);

d(i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X+u,canvas.PenPos. Y) ;

d(i-1|, canvas|);

canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y-u);

b(i-1|, canvas|);

end|;

end|;

procedure TForml.FormPaint(Sender: TObject);

begin|

Form1|.Canvas.MoveTo(u, u) ;

а(5,Form1.Canvas); // викреслити криву Гільберта

end|;

end|.

Слід звернути увагу на наступну|таку| особливість реалізації програми. Процедура, яка викреслює елемент а, окрім самої себе (для викреслювання елементу а кривій нижчого порядку|ладу|) викликає|спричиняє| процедури d і ь, опис (текст) яких в тексті програми знаходиться|перебуває| після|потім| процедури а. Щоб|аби| компілятор не вивів повідомлення|сполучення| про помилку, в текст програми поміщено оголошення процедури з|із| ключовим|джерельним| словом forward|, що означає, що це тільки|лише| оголошення, а опис (реалізація) знаходиться|перебуває| далі. Таким чином, вже в процесі компіляції процедури а, компілятор "знає", що імена ь і d означають процедури.

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