Найти - Пользователи
Полная версия: Помощь с ханойскими башнями
Начало » Python для новичков » Помощь с ханойскими башнями
1 2 3
Ktulich
Всем привет. В общем, читаю книги, смотрю видео, нигде не поясняют, как поэтапно конкретно работает данный код.
 def move(n, start, finish):
    if n == 1:
        print(n, start, finish)
    else:
        tmp = 6 - start - finish
        move(n - 1, start, tmp)
        print(n, start, finish)
        move(n - 1, tmp, finish)
move(3, 1, 3)

Вывод:
1 1 3
2 1 2
1 3 2
3 1 3
1 2 1
2 2 3
1 1 3

не понимаю, почему принт выдает разные результаты, хотя n не меняет значение.
m1r42
Ktulich
n не меняет значение.
n - 1 ?
Ktulich
m1r42
если вычитать, то тоже не совпадает
m1r42
Ktulich
если вычитать, то тоже не совпадает
гы, лучше подумайте с какими входящими параметрами запускается каждый раз функция move()
m1r42
move(x,y,z) выполняется всегда, независимо от if else, хочешь этого или нет
рекурсия, может слыхали?

тут я не прав

move() запускается по условию n != 1
xam1816
Ktulich
хотя n не меняет значение.
 move(n - 1, start, tmp)
как вы можете утверждать что n не меняет значение если n - 1???
m1r42
Ладно. Не выдержал. Так будет понятней?
 def move(n, start, finish):
    if n == 1:
        if finish == 2:
            print(n, start, finish, "Я первый принт, я запущен с finish = tmp")
        else:
            print(n, start, finish, "Я третий принт")
    else:
        tmp = 6 - start - finish
        move(n - 1, start, tmp)
        print(n, start, finish, "Я второй принт")
        move(n - 1, tmp, finish)
move(2, 1, 3)
1 1 2 Я первый принт, я запущен с finish = tmp
2 1 3 Я второй принт
1 2 3 Я третий принт
m1r42
Еще вариант, более наглядный, так как вводные данные могут изменяться:
 n = 3
start = 2
finish = 1
temp = 6 - start - finish
def move(n, start, finish):
    if n == 1:
        if finish == temp:
            print(n, start, finish, "Я первый принт, я запущен с finish = temp")
        else:
            print(n, start, finish, "Я третий принт")
    else:
        tmp = 6 - start - finish
        move(n - 1, start, tmp)
        print(n, start, finish, "Я второй принт")
        move(n - 1, tmp, finish)
        
move(n, start, finish)

1 2 1 Я третий принт
2 2 3 Я второй принт
1 1 3 Я первый принт, я запущен с finish = temp
3 2 1 Я второй принт
1 3 2 Я третий принт
2 3 1 Я второй принт
1 2 1 Я третий принт
Ktulich
xam1816
как вы можете утверждать что n не меняет значение если n - 1???

так n то не меняет значение получается, n - 1 то уже условно другая переменная
Ktulich
m1r42
Еще вариант, более наглядный, так как вводные данные могут изменяться:
что то я смотрю на ваш пример и только больше путаюсь

Давайте в моем. Вот как я рассуждаю
1.
 move(3, 1, 3)
- передача значения в функцию —>
 def move(n, start, finish)
—>
 def move(3, 1, 3)
2.
 if n == 1:
        print(n, start, finish)
пропускаем, n != 1
3.
 else:
        tmp = 6 - start - finish
—> tmp = 2. В данный момент n = 3, start = 1, tmp = 2, finish = 3
4.
 move(n - 1, start, tmp)
—->
 move(2, 1, 2)
Но в принт это не ушло, это просто запомнила программа
5.
 print(n, start, finish)
—> выводим принт передавая в него 3, 1 ,3
6.
 move(n - 1, tmp, finish)
—>
 move(2, 2, 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