Вероятно, самое простое решение для Ханойских Башен работает следующим образом:
Чтобы переместить x
диски из колышка A в колышек C, используя колышек B в качестве вспомогательного колышка:
- Переместите
x-1
диски из колышка A в колышек B, используя колышек C в качестве вспомогательного колышка. - Переместите
x
'-ый диск из колышка A в колышек C (дополнительный колышек не требуется,потому что вы перемещаете только один диск). - Переместите
x-1
диски из колышка B в колышек C, используя колышек A в качестве вспомогательного колышка.
Обратите внимание, что по порядкудля перемещения дисков x
необходимо переместить диски x-1
.Вы можете просто использовать ту же функцию для перемещения этих дисков x-1
и просто переключать, какие колышки являются колышками source, dest и aux.Вот что делает Towers of Hanoi таким распространенным примером рекурсии, и именно такой шаблон вы должны увидеть в задаче, чтобы рекурсия работала для вас.Конечно, это не обязательно должен быть «переместить x-1
диски» ... это может быть что-то вроде «перечислить эту подпапку».Деревья (например, каталог с подпапками и т. Д.) - это еще одно место, где сияет рекурсия.Как и в случае других заданий, когда для выполнения задания над элементом вам, возможно, потребуется выполнить ту же работу с вложенными элементами.
Теперь, чтобы иметь полезную рекурсию, вам нужен «базовый случай»- состояние, при котором рекурсия остановится.Если вы этого не сделаете, код будет работать вечно (или, по крайней мере, пока он не исчерпает память или не переполнит стек вызовов).Базовый случай здесь возникает, когда x == 0
(так как перемещение 0 дисков означает, что вы ничего не делаете из-за if
вокруг основной части функции).Это также может быть, когда x == 1
, как тогда, вам не нужно повторяться, но дополнительные if
перед каждым вызовом hanoi
добавят немного шума (и главное преимущество рекурсивного решения - его простота).,В любом случае, когда x == 0
, функция возвращается, ничего не делая.Функция, которая вызывала ее (у которой было x == 1
), теперь продолжает делать свое дело - в этом случае, говоря «переместить диск 1 из src в dest», а затем снова вызывая функцию hanoi
с переключенными аргументами.
Поток идет примерно так:
hanoi(3, src, aux, dest)
hanoi(2, src, dest, aux)
hanoi(1, src, aux, dest)
hanoi(0, src, dest, aux) // no op
print "Move 1 from src to dest"
hanoi(0, aux, src, dest) // no op
print "Move 2 from src to aux"
hanoi(1, dest, src, aux)
hanoi(0, dest, aux, src) // no op
print "move 1 from dest to aux"
hanoi(0, src, dest, aux) // no op
print "move 3 from src to dest"
hanoi(2, aux, src, dest)
hanoi(1, aux, dest, src)
hanoi(0, aux, src, dest) // no op
print "Move 1 from aux to src"
hanoi(0, dest, aux, src) // no op
print "Move 2 from aux to dest"
hanoi(1, src, aux, dest)
hanoi(0, src, dest, aux) // no op
print "move 1 from src to dest"
hanoi(0, aux, src, dest) // no op