Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 10, 2022 19:15:52

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

Ktulich
ак, доведя до n == 1, рекурсия не останавливается
когда дошло до n == 1, вывелись на экран аргументы, функция закончила работу, курсор вернулся обратно в функцию move(2, 1, 2) после функции move(1, 1, 3), там идет print(n, start, finish) - вывелось 2, 1, 2

Офлайн

#2 Ноя. 10, 2022 20:37:54

Ktulich
Зарегистрирован: 2022-11-10
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

xam1816
когда дошло до n == 1, вывелись на экран аргументы, функция закончила работу, курсор вернулся обратно в функцию move(2, 1, 2) после функции move(1, 1, 3), там идет print(n, start, finish) - вывелось 2, 1, 2
а почему он сразу не выводит 2, 1, 2, а ждет, пока выведет 1, 1, 3 ?

Офлайн

#3 Ноя. 10, 2022 21:10:14

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

Ktulich
а почему он сразу не выводит 2, 1, 2, а ждет, пока выведет 1, 1, 3 ?
потому что когда вызывается функция, он все бросает и выполняет эту функцию

Офлайн

#4 Ноя. 10, 2022 22:20:45

Ktulich
Зарегистрирован: 2022-11-10
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

xam1816
как вам такое Илон Маск
дописал 3 последних принта, правильно?

 def move(n, start, finish):  # n=1, start=2, finish=1
    if n == 1:  # True
        print(n, start, finish)  # print 1, 2, 1
    else:
        tmp = 6 - start - finish  # сюда не идет
        move(n - 1, start, tmp)
        print(n, start, finish)
        move(n - 1, tmp, finish)
    # функция закончила работу курсор возвращается к точке возврата 4 для удобства написал ее снова ниже
# VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish):  # n=2, start=2, finish=3
    if n == 1:  # False
        print(n, start, finish)  # пропускаем
    else:
        tmp = 6 - start - finish  # 6 - 2 - 3 = 1
        move(n - 1, start, tmp)  # выполняем move(2-1, 2, 1) = move(1, 2, 1) точка возврата 4> move(1,2,1) закончилась
        print(n, start, finish)  # print 2, 2, 3
        move(n - 1, tmp, finish)  # выполняем move(1, 1, 3)
# VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish):  # n=1, start=1, finish=3
    if n == 1:  # True
        print(n, start, finish)  # print 1, 1, 3
    else:
        tmp = 6 - start - finish  # сюда не идет
        move(n - 1, start, tmp)
        print(n, start, finish)
        move(n - 1, tmp, finish)

Офлайн

#5 Ноя. 10, 2022 23:18:52

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

Ktulich
дописал 3 последних принта, правильно?
да как-то так

Офлайн

#6 Ноя. 10, 2022 23:55:03

Ktulich
Зарегистрирован: 2022-11-10
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

xam1816
да как-то так

Спасибо всем, разобрался

Офлайн

#7 Ноя. 11, 2022 00:24:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

Ktulich
не понимаю, почему принт выдает разные результаты, хотя n не меняет значение.
Тебе надо с рекурсией разбираться. И возьми для этого какую-нибудь функцию попроще. Если ты считаешь, что n не меняется, это значит, что ты не понимаешь, как рекурсивная функция работает и копирует саму себя в точно такие же экземпляры. Там получается лестница из абсолютно одинаковых функций. Всё это надо представлять при работе с рекурсиями. Тогда ты будешь знать, что n в одной копии функции и n в другой копии функции - это разные n'ки, и таких разных n'ок могут быть тысячи.



Отредактировано py.user.next (Ноя. 11, 2022 00:25:39)

Офлайн

#8 Ноя. 11, 2022 07:43:25

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Помощь с ханойскими башнями

Вот еще вариант для наглядности. Подписал параметры для наглядности, на самом деле это тоже результат. Рост количества запусков процедуры внутри процедуры растет по формуле 2**0+2**1+2**n-1 …

 spase = "             "
def move(n,start,finish):
    if n == 1:
        print(spase*(m-1),"move(",n,start,finish,") --- результат")
    else:
        tmp = 6 - start - finish
        move(n-1,start,tmp)
        print(spase*(m-n),"move(",n,start,finish,") --- параметры")
        move(n-1,tmp,finish)
n = 3
m = n
move(n,1,3)
                           move( 1 1 3 ) --- результат
move( 2 2 3 ) --- параметры
move( 1 2 1 ) --- результат
move( 3 1 3 ) --- параметры
move( 1 3 2 ) --- результат
move( 2 1 2 ) --- параметры
move( 1 1 3 ) --- результат

Отредактировано m1r42 (Ноя. 11, 2022 09:53:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version