Я чувствую боль!
Хотя это старый пост, я думаю, что действительно нужно понять, это не подход "переместить это к этому", а то, что ответ включает использование побочного эффекта рекурсии.
Для меня неоценимой помощью был «Маленький интриган», который учит думать и писать рекурсивные функции.
Однако это учит читателя использовать результаты возвращенного результата в следующем рекурсивном вызове.
В Ханойской башне ответ не в возвращенном результате как таковом, а в наблюдении за возвращенным результатом.
Волшебство происходит в последовательной перегруппировке параметров функции.
Да, проблема действительно в трех частях:
- перемещение башни меньшего размера на запасную опору
- перемещение последнего диска в пункт назначения
- перемещение оставшейся башни на запасном колышке к месту назначения.
На схеме:
(define (th n a b c)
(if (zero? n) 'done
(begin
(th (- n 1) a c b)
(display (list a c))
(newline)
(th (- n 1) b a c))))
(th 5 'source 'spare 'destination)
Однако именно отображение параметров функции является решением проблемы и принципиальным пониманием структуры вызовов, подобной двойному дереву.
Решение также передает мощность proof by induction
и теплого свечения всем программистам, которые боролись с обычными структурами управления.
Кстати, решение проблемы вручную вполне удовлетворительно.
- считать количество дисков
- если даже, переместите первый диск в запасную колышек, сделайте следующий законный ход (не включая верхний диск). Затем переместите верхний диск к колышку назначения, сделайте следующий законный ход (nittd). Затем переместите верхний диск к исходной колышке, сделайте следующий допустимый ход (nittd) ...
- если нечетно, переместите первый диск к колышку назначения, сделайте следующий допустимый ход (не включая верхний диск). Затем переместите верхний диск на запасную колышек, сделайте следующий законный ход (nittd). Затем переместите верхний диск к исходной колышке, сделайте следующий допустимый ход (nittd) ...
Лучше всего делать, всегда держа верхний диск одной и той же рукой и всегда перемещая эту руку в одном направлении.
Окончательное число ходов для дисков n
: 2^n - 1
, move n disc to destination
находится на полпути в процессе.
Наконец, забавно, как объясняя проблему коллеге, вашей жене / мужу или даже собаке (даже если они ее не слушают) могут закрепить просветление.