мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Это старая версия документа!


Рекурсия и рекуррентные соотношения

Рекуррентные соотношения

Рекурсия

Программа, рисующая квадраты от центра (квадрата)

Сначала подготовимся.

| Рисование квадрата в центре
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.