Render.ru

Рекурсия

Олег Нарижный

Пользователь сайта
Рейтинг
2
#1
Дерево Пифагора
Пробовал писать логично, все получилось, но почитал в Listener - понял это писание крайне приблизительно. Прошу объяснить эти танцы рекурсии

clearListener()
fn DP d mx my ug dug n = (
if(n == 0) then (format"Ah!\n")
else(
vec = d*cos(45) * [cos(ug + 45), sin(ug + 45),0]
mr = [mx, my,0] + vec

r = rectangle length:d width:d
r.pos = mr
r.wirecolor = white
rotate r (angleaxis ug [0,0,1])

m = mr + d*cos(45) * [cos(ug + 45 + 90), sin(ug + 45 + 90),0]
format"do 1-go vizova n = %\n" n
DP (d * cos(dug)) m.x m.y (ug + dug) dug (n - 1)
format"posle 1-go vizova n = %\n" n
m1 = mr + d*cos(45) * [cos(ug+45), sin(ug+45),0]
m2 = d * sin(dug) * [cos(ug+90+dug), sin(ug+90+dug),0]
mm = m1 + m2

DP (d*sin(dug)) mm.x mm.y (ug - 90 + dug) (dug) (n - 1)
format"posle 2-go vizova n = %\n" n
)
)

DP 100 0 0 0 30 3



OK
dp()
do 1-go vizova n = 3
do 1-go vizova n = 2
do 1-go vizova n = 1
Ah!
posle 1-go vizova n = 1
Ah!
posle 2-go vizova n = 1
posle 1-go vizova n = 2
do 1-go vizova n = 1
Ah!
posle 1-go vizova n = 1
Ah!
posle 2-go vizova n = 1
posle 2-go vizova n = 2
posle 1-go vizova n = 3
do 1-go vizova n = 2
do 1-go vizova n = 1
Ah!
posle 1-go vizova n = 1
Ah!
posle 2-go vizova n = 1
posle 1-go vizova n = 2
do 1-go vizova n = 1
Ah!
posle 1-go vizova n = 1
Ah!
posle 2-go vizova n = 1
posle 2-go vizova n = 2
posle 2-go vizova n = 3
OK
OK
 
Последнее редактирование:
Рейтинг
31
#2
Ну и что не так с рекурсией? Вроде всё норамльно.
Я вот просто вставил табуляции в твой лог. Отступ увеличивается при рекурсивном вызове функции и уменьшается при возврате из рекурсивного вызова. На каждом уровне отступа, а их у тебя 4 ("Ah" - это n= 0), значение n одинаково. Всё законно.
Код:
do 1-go vizova n = 3
    do 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 2-go vizova n = 2
posle 1-go vizova n = 3
    do 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 2-go vizova n = 2
posle 2-go vizova n = 3
При входе в функцию (т.е. в момент вызова функции) выделяется память для своего набора переменных-аргументов для этого вызова, которые инициализируются теми значениями, которые имели переменные в вызывающем коде на момент вызова функции.
 

Олег Нарижный

Пользователь сайта
Рейтинг
2
#3
Ну и что не так с рекурсией? Вроде всё норамльно.
Я вот просто вставил табуляции в твой лог. Отступ увеличивается при рекурсивном вызове функции и уменьшается при возврате из рекурсивного вызова. На каждом уровне отступа, а их у тебя 4 ("Ah" - это n= 0), значение n одинаково. Всё законно.
Код:
do 1-go vizova n = 3
    do 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 2-go vizova n = 2
posle 1-go vizova n = 3
    do 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 2-go vizova n = 2
posle 2-go vizova n = 3
При входе в функцию (т.е. в момент вызова функции) выделяется память для своего набора переменных-аргументов для этого вызова, которые инициализируются теми значениями, которые имели переменные в вызывающем коде на момент вызова функции.
Спасибо, разобрался. Прошу прощения за отступы, не имею опыта писать в форумах
 

Олег Нарижный

Пользователь сайта
Рейтинг
2
#4
Спасибо, разобрался. Прошу прощения за отступы, не имею опыта писать в форумах
Ну и что не так с рекурсией? Вроде всё норамльно.
Я вот просто вставил табуляции в твой лог. Отступ увеличивается при рекурсивном вызове функции и уменьшается при возврате из рекурсивного вызова. На каждом уровне отступа, а их у тебя 4 ("Ah" - это n= 0), значение n одинаково. Всё законно.
Код:
do 1-go vizova n = 3
    do 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 2-go vizova n = 2
posle 1-go vizova n = 3
    do 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 1-go vizova n = 2
        do 1-go vizova n = 1
            Ah!
        posle 1-go vizova n = 1
            Ah!
        posle 2-go vizova n = 1
    posle 2-go vizova n = 2
posle 2-go vizova n = 3
При входе в функцию (т.е. в момент вызова функции) выделяется память для своего набора переменных-аргументов для этого вызова, которые инициализируются теми значениями, которые имели переменные в вызывающем коде на момент вызова функции.
Если так, то почему в Питоне нужно писать после второго вызова?
from turtle import *
def tree (size, n):
if n == 0:
return
fd(size)
lt(a)
tree(size-d, n-1)
rt(2*a)
tree(size-d, n-1)
lt(a)
pu()
bk(size)
pd()

ht()
seth(90)
pu()
goto(0,-200)
pd()
speed(0)
a = 30
d = 5.6
tree(60,10)
done()

Заодно прошу, скажите, как делать отступы. Слипаются, как бы я ни старался.
 
Последнее редактирование:
Рейтинг
31
#5
С Питоном, а тем более с "черепашкой" я тебе не помогу.

Код:
Для вставки кода в сообщение
     надо в окне ввода сообщения 
             нажать четвёртую слева кнопку 
                              - "Вставить..." -
                            и в появившемся списке 
                                         выбрать "Код"
 

Олег Нарижный

Пользователь сайта
Рейтинг
2
#6
С Питоном, а тем более с "черепашкой" я тебе не помогу.

Код:
Для вставки кода в сообщение
     надо в окне ввода сообщения
             нажать четвёртую слева кнопку
                              - "Вставить..." -
                            и в появившемся списке
                                         выбрать "Код"
Спасибо
 
Сверху