Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2015, 13:17   #1
Артём)
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 16
По умолчанию Рекурсия фигур на паскале

Помогите сделать данный код с помощью рекурсии:
Код:
Program recurs;
uses GraphABC;
var x,y,r,d,n:integer;
procedure ris(x,y,r:integer);
var i:integer;
begin
x:=350;
y:=250;
r:=190;
d:=190;
ris(x,y,r);
x:=140;
y:=150;
r:=191;
d:=191;
ris(x,y,r);
x:=400;
y:=150;
r:=349;
d:=249;
ris(x,y,r);
x:=191;
y:=290;
r:=139;
d:=249;
ris(x,y,r);
readln;
end.
А так должна быть рекурсия согласно рисунку,хотя бы приблизительно
Изображения
Тип файла: jpg Безымянный.jpg (4.9 Кб, 127 просмотров)

Последний раз редактировалось Stilet; 17.12.2015 в 10:22.
Артём) вне форума Ответить с цитированием
Старый 12.12.2015, 13:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Это что за ужас, летящий на крыльях ночи?!
Во-первых, данный код ничего не делает (кроме бесконечно-вложенной рекурсиии)
Во-вторых, как бы рекурсия тут уже есть.
Что нужно то?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 15:10   #3
Артём)
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 16
По умолчанию

Я просто сделал код,чтобы фигуры были просто нарисованы,мне сказали выразить через рекурсию,чтобы они повторялись.
Артём) вне форума Ответить с цитированием
Старый 12.12.2015, 15:29   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Я просто сделал код,чтобы фигуры были просто нарисованы
Вы нас обманываете.
Приведённая Вами программа НИЧЕГО НЕ РИСУЕТ.
у неё нет внутри операторов вывода графики.
Значит, либо рисует у Вас ДРУГАЯ программа, либо Вы нас банально пытаетесь ввести в заблуждение.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.12.2015, 00:22   #5
Артём)
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 16
По умолчанию

Код:
procedure ris1(x1,y1,x2,y2: integer);
begin
if ((x2-x1)div 2 <10 )then exit;
rectangle(x1,y1,x2,y2);
ris1(x1-(x2-x1)div 2,y1 - (y2 - y1)div 2,x1,y1);
ris1(x1-(x2-x1)div 2,y2 + (y2 - y1)div 2,x1,y2);
ris1(x2,y2,x2+(x2-x1)div 2,y2 + (y2 - y1)div 2);
ris1(x2,y1,x2+(x2-x1)div 2,y1 - (y2 - y1)div 2);
end;
begin
ris1(200,200,300,300);
end.
Объясните построчно пожалуйста)

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 17.12.2015 в 09:52.
Артём) вне форума Ответить с цитированием
Старый 17.12.2015, 09:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну вот, теперь уже видно, что делает программа.

построчно Вы сами разберёте.
я только подскажу принцип.

у Вас есть рекурсивная процедура Ris1 в которую передаются координаты прямоугольника. Она делает следующее:
Код:
  // проверка выхода, чтобы избежать бесконечного зацикливания
  //  проверяем, если половина стороны прямоугольника  по оси Х меньше 10 (это размер будущих маленьких прямоугольничков - меньше 10 точек не рисовать) 
  //  тогда - выходим из процедуры
  if ((x2-x1)div 2 <10 )then exit; 

  // нарисовать прямоугольник по переданным в процедуру координатам
  rectangle(x1,y1,x2,y2);

  // а вот и рекурсия


  // вызвать рекурсивно (т.е. саму себя) процедуру рисования вложенных фигур с параметрами нового прямоугольника по координатам 
  ris1(x1-(x2-x1)div 2,y1 - (y2 - y1)div 2,x1,y1);

  // вызвать рекурсивно (т.е. саму себя) процедуру рисования вложенных фигур с параметрами нового прямоугольника по координатам 
  ris1(x1-(x2-x1)div 2,y2 + (y2 - y1)div 2,x1,y2);

  // вызвать рекурсивно (т.е. саму себя) процедуру рисования вложенных фигур с параметрами нового прямоугольника по координатам 
  ris1(x2,y2,x2+(x2-x1)div 2,y2 + (y2 - y1)div 2);

  // вызвать рекурсивно (т.е. саму себя) процедуру рисования вложенных фигур с параметрами нового прямоугольника по координатам 
  ris1(x2,y1,x2+(x2-x1)div 2,y1 - (y2 - y1)div 2);

Последний раз редактировалось Serge_Bliznykov; 17.12.2015 в 10:01.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.12.2015, 20:17   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Отмечу, что данный код рисует "лишние" прямоугольники внутри прямоугольника "родителя".
Например, тут нет лишних прямоугольников, но код получился менее красивым. И задаются не противоположные углы прямоугольника, а верхний левый угол и длины сторон. Но если вы позаимствуете идею с четвертями и добавите в код выше (в 5 сообщении) парочку ифов, то лишние прямоугольники не будут рисоваться.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.12.2015 в 20:20.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия на Паскале gronet Помощь студентам 1 24.05.2012 07:52
Рекурсия на паскале Lara12 Паскаль, Turbo Pascal, PascalABC.NET 5 16.10.2011 22:41
Задача в паскале (рекурсия) Feil Помощь студентам 2 25.12.2009 12:04