Форум программистов, компьютерный форум CyberForum.ru

График,используя рекурсию - C++

Восстановить пароль Регистрация
 
ilucky93
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 2
04.03.2014, 23:13     График,используя рекурсию #1
Помогите, пожалуйста, с заданием. Нужно нарисовать рисунок, используя рекурсию.
Миниатюры
График,используя рекурсию  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gunslinger
случайный прохожий
 Аватар для gunslinger
1097 / 715 / 184
Регистрация: 20.07.2013
Сообщений: 1,970
05.03.2014, 02:37     График,используя рекурсию #2
Builder (не знаю, как с рекурсией, но в цикле сделать проще):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void pen(TColor C)
{
  Form1->Canvas->Pen->Color = C;
}
//---------------------------------------------------------------------------
void brush(TColor C)
{
  Form1->Canvas->Brush->Color = C;
}
//---------------------------------------------------------------------------
void rectangle(int x1, int y1, int x2, int y2)
{
  Form1->Canvas->Rectangle(x1, y1, x2, y2);
}
//---------------------------------------------------------------------------
TColor pixel(int x, int y)
{
  return Form1->Canvas->Pixels[x][y];
}
//---------------------------------------------------------------------------
void draw(int n)
{
  InvalidateRect(NULL, NULL, 1);
  const p = 512;
  int k = 1, i, j, x, y, temp;
  TColor B = clBlack, W = clWhite;
  for (k = 1; k <= n; k++)
  {
    temp = pow(2, k-1);
    for (i = 1; i <= temp; i++)
      for (j = 1; j <= temp; j++)
      {
        x = (i*2-1)*p/temp/2;
        y = (j*2-1)*p/temp/2;
        if (pixel(x, y) == B)
        {
          pen(W);
          brush(W);
        }
        else
        {
          pen(B);
          brush(B);
        }
        rectangle(x, y, i*p/temp, j*p/temp);
      }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Color = clBlack;
  int n = 4;
  draw(n);
  Caption = "Рисунок, n = " + String(n);
}
//---------------------------------------------------------------------------
Миниатюры
График,используя рекурсию   График,используя рекурсию   График,используя рекурсию  

ilucky93
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 2
05.03.2014, 22:12  [ТС]     График,используя рекурсию #3
к сожалению, сказали решить нужно именно с помощью рекурсивной процедуры(( уже неделю сижу над решением. никак не дойдет((
gunslinger
случайный прохожий
 Аватар для gunslinger
1097 / 715 / 184
Регистрация: 20.07.2013
Сообщений: 1,970
06.03.2014, 01:34     График,используя рекурсию #4
Хотя теоретически любой "цикл" можно перевести в рекурсию (и наоборот), тут случай, когда рекурсия "хуже".
Получилось так (пришлось использовать глобальную переменную):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//...........................................................................
int tag;
 
void recur_draw(int n)
{
  const p = 512;
  int k, i, j, x, y, temp;
  TColor B = clBlack, W = clWhite;
  if (n <= tag/10 && n > 0)
  {
    k = tag%10;
    temp = pow(2, k-1);
    for (i = 1; i <= temp; i++)
      for (j = 1; j <= temp; j++)
      {
        x = (i*2-1)*p/temp/2;
        y = (j*2-1)*p/temp/2;
        if (pixel(x, y) == B)
        {
          pen(W);
          brush(W);
        }
        else
        {
          pen(B);
          brush(B);
        }
        rectangle(x, y, i*p/temp, j*p/temp);
      }
    tag++;
    recur_draw(tag%10);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  InvalidateRect(NULL, NULL, 1);
  Color = clBlack;
  int n = 4;
  tag = n*10+1;
  recur_draw(n);
  Caption = "Рисунок, n = " + String(n);
}
//---------------------------------------------------------------------------
Yandex
Объявления
06.03.2014, 01:34     График,используя рекурсию
Ответ Создать тему
Опции темы

Текущее время: 20:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru