У меня возникли проблемы с поиском правильного итерационного метода для проблемы ханойских башен в python

#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) он всегда будет вставлять буквы в таком порядке.