Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 10, 2022 00:32:07

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

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

Всем привет. В общем, читаю книги, смотрю видео, нигде не поясняют, как поэтапно конкретно работает данный код.

 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 не меняет значение.

Отредактировано Ktulich (Ноя. 10, 2022 11:56:56)

Офлайн

#2 Ноя. 10, 2022 08:06:53

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

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

Ktulich
n не меняет значение.
n - 1 ?

Отредактировано m1r42 (Ноя. 10, 2022 08:09:38)

Офлайн

#3 Ноя. 10, 2022 09:38:43

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

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

m1r42
если вычитать, то тоже не совпадает

Офлайн

#4 Ноя. 10, 2022 09:51:02

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

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

Ktulich
если вычитать, то тоже не совпадает
гы, лучше подумайте с какими входящими параметрами запускается каждый раз функция move()

Офлайн

#5 Ноя. 10, 2022 10:00:28

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

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

move(x,y,z) выполняется всегда, независимо от if else, хочешь этого или нет
рекурсия, может слыхали?

тут я не прав

move() запускается по условию n != 1

Отредактировано m1r42 (Ноя. 10, 2022 10:32:40)

Офлайн

#6 Ноя. 10, 2022 10:19:13

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

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

Ktulich
хотя n не меняет значение.
 move(n - 1, start, tmp)
как вы можете утверждать что n не меняет значение если n - 1???

Офлайн

#7 Ноя. 10, 2022 10:20:41

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

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

Ладно. Не выдержал. Так будет понятней?

 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 (Ноя. 10, 2022 10:25:26)

Офлайн

#8 Ноя. 10, 2022 10:44:39

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

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

Еще вариант, более наглядный, так как вводные данные могут изменяться:

 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 Я третий принт

Отредактировано m1r42 (Ноя. 10, 2022 10:45:29)

Офлайн

#9 Ноя. 10, 2022 11:52:34

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

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

xam1816
как вы можете утверждать что n не меняет значение если n - 1???

так n то не меняет значение получается, n - 1 то уже условно другая переменная

Офлайн

#10 Ноя. 10, 2022 12:17:26

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

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

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)
Но в принт это не ушло, это просто запомнила программа

А и всё дальше затык, я дальше не понимаю как здесь работает рекурсия

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version