#python
Вопрос:
Мне было поручено найти итеративное решение проблемы Ханойской башни на python, и я нашел псевдокод, который очень помог. Единственная проблема заключается в том, что этот псевдокод не помогает перемещать диск в обратном направлении. Следующий код показывает правильные 2 полюса, участвующих в движении, но не всегда правильное направление. Знает ли кто-нибудь, как решить эту проблему, или знает другое решение? Вот ссылка на сайт, где я нашел псевдокод https://www.geeksforgeeks.org/iterative-tower-of-hanoi/. (мой код начинается со следующего определения, но я не могу заставить его также быть в блоке кода)
def hanoi_iterative(n):
moves = []
number_of_moves = 2**n-1
starting_pole = 'A'
middle_pole = 'B'
end_pole = 'C'
i = 0
if n % 2==0:
end_pole = 'B'
middle_pole = 'C'
while i in range(0,number_of_moves):
i =1
if i%3 == 1:
moves.append(starting_pole end_pole)
if i%3 == 2:
moves.append(starting_pole middle_pole)
if i%3 == 0:
zetten.append(middle_pole end_pole)
return moves
Ответ №1:
для меня код работает нормально, у вас есть опечатка в коде вашего вопроса (последнее утверждение if zetten.append() вместо moves.append()
def hanoi_iterative(n):
moves = []
number_of_moves = 2**n-1
starting_pole = 'A'
middle_pole = 'B'
end_pole = 'C'
i = 0
if n % 2==0:
end_pole = 'B'
middle_pole = 'C'
while i in range(0,number_of_moves):
i =1
if i%3 == 1:
moves.append(starting_pole end_pole)
if i%3 == 2:
moves.append(starting_pole middle_pole)
if i%3 == 0:
moves.append(middle_pole end_pole)
return moves
print(hanoi_iterative(3))
Что именно не так, что вы хотите, чтобы это делало? Каким должно быть движение назад?
Комментарии:
1. Например, если n=3, правильный код [«AC», «AB», «CB», «AC», «BA», «BC», «AC»], в то время как мой код дает [«AC», «AB», «BC», «AC», «AB», «BC», «AC»]. Поэтому в моем коде » BC » и » AB » должны быть переключены, потому что вы перемещаете диск с полюса C на полюс B, а не иначе. Мой код прямо сейчас не различает, в каком направлении движется диск, в моем коде диск всегда движется вправо. Таким образом, мой код верен для конкретных полюсов, на которых происходит движение, но не для направления.
2. @Thomas эта проблема связана с заявлениями, которые добавляются в ваш список.
moves.append(starting_pole mid_pole)
он всегда будет вставлять буквы в таком порядке.