Рисуване на кула

Нарисувайте кула от квадрати, като показаната на фигурата.
image

Можем да направим процедура за изчертаване на кулата (tower), като използваме процедура за квадрат (square) с различна страна:

to square :l
repeat 4 [fd :l rt 90]
end

to tower
square 80 fd 80
square 60 fd 60
square 40 fd 40
end

Забелязваме, че кулата се получава с повтаряне на командите: "square ... fd ..." като всеки път дължината на страната се намалява с 20.
Така че можем да напишем процедурата tower като използваме параметър за дължината на страната на квадрата (:L)

to tower :L
square :L
fd :L
tower :L-20
end

Когато една процедура се извиква от тялото си (тоест от списъка от команди на самата процедура), говорим, че се прави рекурсия.
В този случай сме направили безкрайна рекурсия. Можем да спрем изпълнението й с бутона "Halt".

За да накараме рекурсията да спре, трябва да сложим някакво крайно условие, например, ако дължината на квадрата е по-малка от 20:

to tower :L
if :L < 20 [stop]
square :L
fd :L
tower :L-20
end

Ако искаме да направим всяко следващо квадратче да е 2 пъти по-малко от предишното, ще трябва да променим формулата, при следващото викане на tower:

to tower :L
if :L < 20 [stop]
square :L
fd :L
tower :L /2
end

Рисуване на дърво

А сега нека се опитаме да нарисуваме дърво

image image

Ако разгледаме дървото на картинката, ще забележим че то се състои от една основна форма (стъбло и 2 клончета), която се повтаря като дължината на клончетата намалява двойно към върховете на дървото.

Да започнем с изрусуване на стъбло с 2 клончета.

to tree :L

fd :L

lt 30
fd :L/2
bk :L/2
rt 30

rt 30
fd :L/2
bk :L/2
lt 30

bk :L
end

Нека сега вместо да рисуваме клонче да извикаме рекурсивно процедурата tree, която да изрусува отново стъбло с 2 клончета:

to tree :L

fd :L

lt 30
tree :L/2
rt 30

rt 30
tree :L/2
lt 30

bk :L
end

Отново получихме безкрайна рекурсия. За да я ограничим, можем да сложим едно гранично условие в началото на процедурата:


to tree :L
if :L < 10 [ stop]

fd :L

lt 30
tree :L/2
rt 30

rt 30
tree :L/2
lt 30

bk :L
end



Фракталите са форми образувани, чрез повторение на някаква основна форма, обикновено чрез рекурсия:

image

 

Рекурсия

1) Представлява извикване на процедурата сама себе си
2) Трябва поне един от параметрите да се променя
3) Трябва да има гранично условие, при което рекурсията да спре

Задачa за самостоятелна работа:





Примерно решение, без центриране на къщичките. Всяка следваща къщичка е 2/3 от предишната.

to house :L
if :l < 10 [stop]
square :L*2/3
fd :L*2/3
setxy :L*1/3 :L
setxy :L*2/3 :L*2/3
pu home pd
house :L*2/3
end