Рекурсия не зашла в мою ту...ю голову

shalfey

Новичок
Пользователь
Дек 12, 2024
3
0
1
Простейший код. Рекурсия.
Python:
def draw(  n):
    if n == 0:
       return
    print( 'n =', n)
    print('1')
    draw(  n-1)
    print('2')
  
    print('3')

    
draw(2)


вывод в консоль
n = 2
1
n = 1
1
2
3
2
3
Вопрос , почему код выводит два раз цифры 2 и 3
 

shalfey

Новичок
Пользователь
Дек 12, 2024
3
0
1
Функция последние два ряда кода повторяет n раз, че то не врубаюсь. Она поднимается вверх по вызовам.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 676
479
83
когда последняя функция в стеке рекурсии завершается, завершаются остальные, которые выше по стеку

вывод в консоль
n = 2 - первый вызов print( 'n =', n)
1 - первый вызов print('1')
n = 1 - второй вызов (рекурсия) print( 'n =', n)
1 - второй вызов (рекурсия) print('1')
2 - второй вызов (рекурсия) print('2')
3 - второй вызов (рекурсия) print('3')
2 - первый вызов print('2')
3 - первый вызов print('3')
 
  • Мне нравится
Реакции: Dr. Mundo

shalfey

Новичок
Пользователь
Дек 12, 2024
3
0
1
Спасибо а вот если за второй рекурсией идет еще одна то это треш. Я не выдумал это пример из книги по Python, эта рекурсия с помошью черепашки рисует снежинку. Там ваще....
 

Dr. Mundo

Модератор
Команда форума
Модератор
Фев 13, 2024
26
1
3
Давайте разберем пошагово выполнение этой рекурсивной функции:

Сначала вызывается draw(2):

Python:
n = 2
print('1')
draw(1)  <- здесь функция ждет завершения рекурсивного вызова
print('2')
print('3')

Внутри выполняется draw(1):

Python:
n = 1
print('1')
draw(0)  <- здесь функция ждет завершения рекурсивного вызова
print('2')
print('3')

  1. draw(0):
    • Поскольку n = 0, функция просто возвращается (return)
  2. Теперь выполнение возвращается к draw(1) и продолжается:
    • Печатает '2'
    • Печатает '3'
  3. Затем выполнение возвращается к первоначальному вызову draw(2) и завершает его:
    • Печатает '2'
    • Печатает '3'

Поэтому полный порядок вывода такой:

Python:
n = 2
1
n = 1
1
2    <- от draw(1)
3    <- от draw(1)
2    <- от draw(2)
3    <- от draw(2)

Цифры 2 и 3 выводятся дважды потому, что они находятся после рекурсивного вызова и выполняются для каждого уровня рекурсии (для n=2 и для n=1).
 

Форум IT Специалистов