мета-данные страницы
Это старая версия документа!
Рекурсия и рекуррентные соотношения
Рекуррентные соотношения
Рекурсия
Программа, рисующая квадраты от центра (квадрата)
Сначала подготовимся.
- | Рисование квадрата в центре
uses oglgraph; // Необходимая библиотека, у нас заменяет graph var gd, gm: smallint; mx, my, cx, cy:smallint, x, y, d:smalint; begin gd := Detect; // Автоматическая установка разрешения gm := DetectMode; initgraph(gd, gm, ''); // Открытие "графического окна" {далее все, что Вы хотите нарисовать, например:} mx := maxX; my := maxY; cx := mx div 2; cy := my div 2; x := cx; y := cy; d :=cx div 4; rectangle(x-d, y-d, x+d, y+d); // А вот и рисование !!!!!! {конец отрисовки} repeat until graphkeypressed; // Задержка закрытия графического окна до нажатия // клавиши для завершения работы программы - // иначе рискуете ничего толком не увидеть closegraph(); // закрытие графического окна - не обязательно, но рекомендуемо. end.
Введение процедуры для рисования "от центра"
- | Использование процедуры
uses oglgraph; // Необходимая библиотека, у нас заменяет graph var gd, gm: smallint; mx, my, cx, cy:smallint, x, y, d:smalint; Procedure Crectangle(x,y,d:smallint); begin rectangle(x-d, y-d, x+d, y+d); end; // Раздел кода ************************************************************************************** begin gd := Detect; // Автоматическая установка разрешения gm := DetectMode; initgraph(gd, gm, ''); // Открытие "графического окна" {далее все, что Вы хотите нарисовать, например:} mx := maxX; my := maxY; cx := mx div 2; cy := my div 2; d :=cx div 4; Сrectangle(x,y,d); {конец отрисовки} repeat until graphkeypressed; // Задержка закрытия графического окна до нажатия // клавиши для завершения работы программы - // иначе рискуете ничего толком не увидеть closegraph(); // закрытие графического окна - не обязательно, но рекомендуемо. end.
Рекурсивная процедура с "отсечкой"
- | Использование рекурсивной процедуры
uses oglgraph; // Необходимая библиотека, у нас заменяет graph var gd, gm: smallint; mx, my, cx, cy: smallint; x, y, d: smallint; Procedure Crectangle(x,y,d:smallint); begin rectangle(x-d, y-d, x+d, y+d); end; Procedure Crectangle2(x,y,d:smallint); begin Crectangle(x, y, d); if d >= 1 then Crectangle2(x, y, d div 2); // Рекурсивный вызов с "отсечкой" при маленьком d end; // Раздел кода ************************************************************************************** begin gd := Detect; // Автоматическая установка разрешения gm := DetectMode; initgraph(gd, gm, ''); // Открытие "графического окна" {далее все, что Вы хотите нарисовать, например:} mx := getmaxX; my := getmaxY; cx := mx div 2; cy := my div 2; d := cx div 4; x := cx; y := cy; Crectangle2(x,y,d); //Вызов рекурсивной функции {конец отрисовки} repeat until graphkeypressed; // Задержка закрытия графического окна до нажатия // клавиши для завершения работы программы - // иначе рискуете ничего толком не увидеть closegraph(); // закрытие графического окна - не обязательно, но рекомендуемо. end.
Ковёр Серпинского
- | Использование другой рекурсивной процедуры
uses oglgraph; // Необходимая библиотека, у нас заменяет graph var gd, gm: smallint; mx, my, cx, cy: smallint; x, y, d: smallint; Procedure Crectangle(x,y,d:smallint); begin rectangle(x-d, y-d, x+d, y+d); end; Procedure Crectangle3(x,y,d:smallint); begin if d >= 1 then begin Crectangle3(x, y, d); d:= d div 2; Crectangle3(x, y-2*d, d); Crectangle3(x-2*d, y, d); Crectangle3(x, y+2*d, d); Crectangle3(x+2*d, y, d); end; // if end; // Раздел кода ************************************************************************************** begin gd := Detect; // Автоматическая установка разрешения gm := DetectMode; initgraph(gd, gm, ''); // Открытие "графического окна" {далее все, что Вы хотите нарисовать, например:} mx := getmaxX; my := getmaxY; cx := mx div 2; cy := my div 2; d := cx div 4; x := cx; y := cy; Crectangle3(x,y,d); //Вызов рекурсивной функции {конец отрисовки} repeat until graphkeypressed; // Задержка закрытия графического окна до нажатия // клавиши для завершения работы программы - // иначе рискуете ничего толком не увидеть closegraph(); // закрытие графического окна - не обязательно, но рекомендуемо. end.
<code pascal | Рисование квадрата в центре>
uses oglgraph; Необходимая библиотека, у нас заменяет graph var gd, gm: smallint; mx, my, cx, cy:smallint, x1, y1, x2, y2, x3, y3: Real; procedurue Serp(x1, y1, x2, y2: Real; n: Integer); var x1n, y1n, x2n, y2n: Real; begin if n > 0 then begin x1n := 2*x1/3 + x2 / 3; x2n := x1/3 + 2*x2 / 3; y1n := 2*y1/3 + y2 / 3; y2n := y1/3+2*y2 / 3; Rectangle(Round(x1n), Round(y1n), Round(x2n), Round(y2n)); Serp(x1, y1, x1n, y1n, n-1); Serp(x1n, y1, x2n, y1n, n-1); Serp(x2n, y1, x2, y1n, n-1); Serp(x1, y1n, x1n, y2n, n-1); Serp(x2n, y1n, x2, y2n, n-1); Serp(x1, y2n, x1n, y2, n-1); Serp(x1n, y2n, x2n, y2, n-1); Serp(x2n, y2n, x2, y2, n-1) en; end; begin gd := Detect; Автоматическая установка разрешения
gm := DetectMode; initgraph(gd, gm, ''); // Открытие "графического окна"
Rectangle(20, 20, 460, 460);
Serp(20, 20, 460, 460, 4); repeat until graphkeypressed; // Задержка закрытия графического окна до нажатия // клавиши для завершения работы программы - // иначе рискуете ничего толком не увидеть
closegraph(); закрытие графического окна - не обязательно, но рекомендуемо. end.