Render.ru
Поддержать

Рекурсия

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

Пользователь сайта
Рейтинг
2
Изменено: 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
Ну и что не так с рекурсией? Вроде всё норамльно.
Я вот просто вставил табуляции в твой лог. Отступ увеличивается при рекурсивном вызове функции и уменьшается при возврате из рекурсивного вызова. На каждом уровне отступа, а их у тебя 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
Black SphinxНу и что не так с рекурсией? Вроде всё норамльно.
Я вот просто вставил табуляции в твой лог. Отступ увеличивается при рекурсивном вызове функции и уменьшается при возврате из рекурсивного вызова. На каждом уровне отступа, а их у тебя 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
Олег НарижныйСпасибо, разобрался. Прошу прощения за отступы, не имею опыта писать в форумах
Black SphinxНу и что не так с рекурсией? Вроде всё норамльно.
Я вот просто вставил табуляции в твой лог. Отступ увеличивается при рекурсивном вызове функции и уменьшается при возврате из рекурсивного вызова. На каждом уровне отступа, а их у тебя 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
С Питоном, а тем более с "черепашкой" я тебе не помогу.

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

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

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

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