Найти - Пользователи
Полная версия: Помощь с ханойскими башнями
Начало » Python для новичков » Помощь с ханойскими башнями
1 2 3
xam1816
Ktulich
ак, доведя до n == 1, рекурсия не останавливается
когда дошло до n == 1, вывелись на экран аргументы, функция закончила работу, курсор вернулся обратно в функцию move(2, 1, 2) после функции move(1, 1, 3), там идет print(n, start, finish) - вывелось 2, 1, 2
Ktulich
xam1816
когда дошло до n == 1, вывелись на экран аргументы, функция закончила работу, курсор вернулся обратно в функцию move(2, 1, 2) после функции move(1, 1, 3), там идет print(n, start, finish) - вывелось 2, 1, 2
а почему он сразу не выводит 2, 1, 2, а ждет, пока выведет 1, 1, 3 ?
xam1816
Ktulich
а почему он сразу не выводит 2, 1, 2, а ждет, пока выведет 1, 1, 3 ?
потому что когда вызывается функция, он все бросает и выполняет эту функцию
Ktulich
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)
xam1816
Ktulich
дописал 3 последних принта, правильно?
да как-то так
Ktulich
xam1816
да как-то так

Спасибо всем, разобрался
py.user.next
Ktulich
не понимаю, почему принт выдает разные результаты, хотя n не меняет значение.
Тебе надо с рекурсией разбираться. И возьми для этого какую-нибудь функцию попроще. Если ты считаешь, что n не меняется, это значит, что ты не понимаешь, как рекурсивная функция работает и копирует саму себя в точно такие же экземпляры. Там получается лестница из абсолютно одинаковых функций. Всё это надо представлять при работе с рекурсиями. Тогда ты будешь знать, что n в одной копии функции и n в другой копии функции - это разные n'ки, и таких разных n'ок могут быть тысячи.
m1r42
Вот еще вариант для наглядности. Подписал параметры для наглядности, на самом деле это тоже результат. Рост количества запусков процедуры внутри процедуры растет по формуле 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 ) --- результат
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB