Образовательные цели урока
- Сформировать понятие рекурсивной процедуры.
- Закрепить на практике навыки использования рекурсивных процедур при создании изображений в Visual Basic.
Количество часов – 4.
Изучение темы «Построение изображений с
помощью рекурсии» рекомендуется проводить после
рассмотрения пользовательских процедур и
решения вычислительных задач с использованием
рекурсивных процедур и функций. На изучение темы
отводится 4 часа.
Изложение материала на уроке сопровождается
показом презентации.
Понятие рекурсии (слайды 1, 2)
Слово «рекурсия» в переводе с латинского (recursio) – возвращение.
Рекурсия – программа или процедура (функция), которая обращается сама к себе как к подпрограмме (функции) непосредственно или через цепочку подпрограмм.
1. Чтобы исключить зацикливание в рекурсии,
нужно правильно оформить условие выхода из неё.
2. Рекурсивная процедура должна вызывать саму
себя с изменённым значением параметра
процедуры.
3. Для хранения промежуточных данных рекурсивной
процедуры требуется большой объём памяти в виде
стека, поэтому количество вложений рекурсии не
может быть очень большим.
Пример 1 (слайды 3-4). Вывести на экран считалку про 10 негритят. Количество негритят вводится с клавиатуры.
В качестве примера рекурсивной процедуры рассмотрим вывод на экран считалки про 10 негритят (по мотивам стихотворения из романа Агаты Кристи «Десять негритят»).
«10 негритят пошли купаться в море,
10 негритят резвились на просторе,
Один из них пропал – и вот вам результат:
9 негритят пошли купаться в море,
9 негритят резвились на просторе,
Один из них пропал – и вот вам результат:
………………….
1 (из) негритят пошли(ел) купаться в море,
1 (из) негритят резвились(ся) на просторе,
Один из них пропал – и вот вам результат:
Нет больше негритят!»
Параметром рекурсивной процедуры будет
переменная n – количество негритят. В
рекурсивной процедуре будет выводиться
очередной куплет. При каждом вызове рекурсивной
процедуры количество n будем уменьшать на 1. Тогда
условием выхода из рекурсии будет n=0.
Рассмотрим алгоритм работы рекурсивной
процедуры на примере n=3 (Рис. 1).
Рисунок 1. Иллюстрация работы рекурсивной процедуры для n=3
Интерфейс проекта представлен на слайде 5.
Программный код проекта (слайды 6, 7) – Приложение 1.
Dim n As Integer
Private Sub Command2_Click() ‘Основная программа
n = InputBox("Введите кол-во негритят", "Ввод данных")
Text2.Text = Str(n)
Call negr(n) ‘вызов рекурсии
End Sub
Sub negr(n) ‘Рекурсивная процедура
If n = 0 Then ‘условие выхода из рекурсии
Text1.Text = Text1.Text & "Нет больше негритят!"
Exit Sub
End If
Text1.Text = Text1.Text & Str(n) & " негритят пошли купаться в море," & Chr(13) & Chr(10)
Text1.Text = Text1.Text & Str(n) & " негритят резвились на просторе," & Chr(13) & Chr(10)
Text1.Text = Text1.Text & "Один из них пропал и вот вам результат:" & Chr(13) & Chr(10)
Text1.Text = Text1.Text & Chr(13) & Chr(10)
Call negr(n – 1) ‘вызов рекурсии с изменённым параметром n
End Sub
Пример 2. Создание изображений с помощью рекурсии.
Построить изображение открывающейся и закрывающейся матрёшки в виде эллипсов (слайды 8-10)
Программный код проекта – Приложение
2.
Параметры рекурсивной процедуры: R – радиус
эллипса; n – количество вложений матрёшек. Пусть
радиус каждой вложенной матрёшки в 2 раза меньше
предыдущей.
На форме разместим графическое окно для вывода
изображения Picture1, текстовое поле Text1 для вывода n
и R, метку Label1 для вывода надписи «Матрешка» и 3
командные кнопки Command1
(Пуск), Command2 (Сброс), Command3 (Выход).
В процедуре кнопки «Пуск» (основной программе) установим шкалу графического окна, зададим начальный радиус R=80 и количество вложений матрёшек n=5. Далее вызываем рекурсивную процедуру построения эллипсов с помощью оператора вызова подпрограмм Call MATR(N, R).
После этого управление передаётся рекурсивной
процедуре MATR(N, R).
Вначале проверяем условие выхода из рекурсии: If N
= 0 Then Exit Sub
При n=0 происходит выход из процедуры. В противном
случае рисуем сначала нижнюю часть эллипса,
затем верхнюю часть.
При этом при каждом повторном вызове рекурсивной
процедуры Call MATR(N – 1, R / 2) задаём измененные
значения параметров процедуры: n уменьшается на 1,
радиус уменьшается в 2 раза. На Рис.2 представлен
результат построения.
Рисунок 2. Матрёшка
Dim N, R As Integer, I As Long
Private Sub Command1_Click() ‘пуск
Picture1.Scale (0, 0)–(200, 200)
N = 5 ‘кол. вложений
R = 80
Call MATR(N, R) ‘первый вызов рекурсии
End Sub
Sub MATR(N, R) ‘Рекурсивная процедура
If N = 0 Then Exit Sub ‘условие выхода из рекурсии
Picture1.Circle (100, 100), R, QBColor(13), 3.14, 6.28, 2 ‘рисуем нижнюю часть эллипса
For I = 1 To 100000000: Next I ‘временная задержка
Call MATR(N – 1, R / 2) ‘вызов рекурсии с изменённым параметром радиуса
Picture1.Circle (100, 100), R, QBColor(13), 0, 3.14, 2 ‘рисуем верхнюю часть эллипса
For I = 1 To 10000000: Next I
End Sub
Пример 3. Проект «Построение рекурсивных изображений».
Создать проект для построения рекурсивных изображений: (слайд 11)
- Окружности по горизонтали
- Окружности по вертикали
- Снежинка
- Снежинка 6-конечная
- Салфетка Серпинского
На слайде 12 представлен интерфейс проекта (Рис. 3).
Рисунок 3. Интерфейс проекта
Для созданных элементов управления установим свойства, приведенные в таблице (слайд 13).
Свойства элементов управления
Элемент управления |
Свойство |
Значение |
Label1 | Caption | Построение рекурсивных изображений |
Command1 | Caption | Окружности по горизонтали |
Command7 | Caption | Окружности по вертикали |
Command2 | Caption | Снежинка |
Command5 | Caption | Снежинка 6-конечная |
Command6 | Caption | Салфетка Серпинского |
Command3 | Caption | Сброс |
Command4 | Caption | Выход |
1. Окружности по горизонтали
От центральной окружности радиуса R
осуществить переход на концы её диаметра (по
горизонтали), которые станут центрами следующих
двух окружностей меньшего радиуса (в 1,5 раза).
Далее снова перейти на концы диаметра полученных
окружностей и построить 4 новые окружности
меньшего радиуса. Процесс повторять, пока
очередной радиус не станет меньше 10.
Интерфейс проекта представлен на слайде 15.
На Рис. 4 представлен результат построения
окружностей для начального R = 30.
Рисунок 4. Окружности по горизонтали
Разработка программного кода (слайды 16-17).
Программный код проекта полностью приведён в Приложении 3.
Dim x, y, R As Single ‘Окружности по горизонтали
Private Sub Command1_Click()
x = 100 ‘Координаты центра
y = 100
R = InputBox(«Ввести R<40», «Ввод данных»)
Picture1.Scale (0, 0)–(200, 200)
Call Ris1(x, y, R) ‘Вызов рекурсивной процедуры
End SubSub Ris1(x, y, R) ‘Построение окружностей по горизонтали
If R < 10 Then Exit Sub ‘Условие выхода из рекурсии
Picture1.Circle (x, y), R, QBColor(5)
Call Ris1(x + R, y, R / 1.5) ‘Ветка вправо
Call Ris1(x – R, y, R / 1.5) ‘Ветка влево
End Sub
2. Самостоятельно создайте программный код кнопки «Окружности по вертикали» (слайд 18)
В рекурсивной процедуре построения окружности
изменяем координату центра y.
При этом записываем вызов процедур для
построения веток окружностей вверх и вниз.
3. Снежинка (слайды 19, 20)
Нарисовать простую снежинку, состоящую из линий (Рис. 5).
Параметры рекурсивной процедуры:
x, y – координаты центра снежинки
d – длина максимального луча исходной снежинки 1 уровня
Выход из рекурсии осуществить при d<5.
Рисунок 5. Снежинка 1 уровень
Разработка программного кода (слайды 21-22).
Программный код проекта полностью приведён в Приложении 3.
Private Sub Command2_Click() ‘Снежинка
x = 0: y = 0 ‘Координаты центра снежинки
d = InputBox(«Ввести длину луча d<100», «Ввод данных»)
Picture1.Scale (–100, 100)–(100, –100)
Call Ris(x, y, d) ‘Вызов рекурсивной процедуры
End Sub
Sub Ris(x, y, d) ‘Снежинка
If d < 5 Then Exit Sub ‘Условие выхода из рекурсии
Picture1.Line (x, y + d / 2)–(x, y – d / 2), QBColor(5)
Picture1.Line (x + d / 2, y)–(x – d / 2, y), QBColor(5)
Picture1.Line (x – d / 3, y + d / 3)–(x + d / 3, y – d / 3), QBColor(5)
Picture1.Line (x + d / 3, y + d / 3)–(x – d / 3, y – d / 3), QBColor(5)
Call Ris(x – d / 2, y, d / 2) ‘Ветка влево
Call Ris(x + d / 2, y, d / 2) ‘Ветка вправо
Call Ris(x, y – d / 2, d / 2) ‘Ветка вниз
Call Ris(x, y + d / 2, d / 2) ‘Ветка вверх
End Sub
4. Снежинка 6-конечная (слайды 23, 24, Рис. 6)
Из центра снежинки (x, y) проводятся лучи длиной d,
угол между которыми 60°. Далее на концах каждого
луча строятся аналогично снежинки (длина луча
при каждом вызове рекурсии уменьшается в 3 раза).
Условием выхода из рекурсии выберем значение d <
5.
Рисунок 6. Снежинка 6-конечная
Разработка программного кода (слайды 25, 26)
Программный код проекта полностью приведён в
Приложении 3.
5. Салфетка Серпинского (Рис. 8, слайды 27, 28, 29)
- Построить равнобедренный треугольник (Рис. 7).
- Построить в нем средние линии.
- Затем в образованных при углах исходного треугольника новых треугольниках опять рисуются средние линии. Процесс повторить до заданного уровня вложенности.
Параметры процедуры:
x, y – координаты вершины треугольника
d – основание и высота треугольника
Рисунок 7. Координаты треугольника
Рисунок 8. Салфетка Серпинского
Разработка программного кода (слайды 31, 32)
Программный код проекта полностью приведён в
Приложении3.
Задания для самостоятельной работы (слайды 33-35)
1. С использованием рекурсивной процедуры построить изображение окружностей по диагонали (аналогично заданию 1 «окружности по горизонтали»).
2. Построить изображение «веточки симметричной».
x, y – координаты начала ветки
i – длина ветки; a – угол наклона
x1, y1 – координаты конца веткиx1 = x + i * Cos(a)
y1 = y + i * Sin(a)
3. Построить изображение снежинки 10-конечной, состоящей из окружностей.
Литература
- Глушаков С.В. , Мельников В.В., Сурядный А.С. Программирование в среде Windows. Visual Basic 6.0. М.: ООО «Издательство АСТ», 2001
- Браун С. Visual Basic. Учебный курс. – Спб.: Питер, 2002
- Есипов А.С., Паныгина Н.Н., Громада М.И. Информатика. Задачник. – СПб: Наука и техника, 2001