Ханойские Башни
Давненько я ничего про Haskell не писал... Исправляюсь.
Задачу про Ханойские Башни (Towers of Hanoi) придумал французский математик Эдуард Люка в 1883 году. Существует легенда об индийском храме в котором есть большая комната с тремя алмазными столбиками на которые нанизано 64 золотых диска. И бог Брама повелел переложить диски с одного столбика на другой, и когда эта задача будет решена наш мир разрушится...
Условия головоломки: есть три столбика, на 1-й нанизана пирамида из n дисков (внизу самый большой диск, над ним чуть меньше и так далее), необходимо переместить эту пирамиду на 3-й столбик, перемещая по одному диску, при этом соблюдая условие что нельзя класть больший диск на меньший.
Это классическая задача на тему "рекурсия" и я думаю все кто хоть как-то связан с программированием её решали. Решается она очень просто:
|
|
Вот тут я наткнулся на вариант задачи, когда необходимо найти не сами перемещения, а состояния столбиков в процессе перемещения (кстати, посмотрите это решение, оно очень интересное). Я не смог удержаться и написал свой вариант:
|
|
Кое что интересное. В функции make_states я сливаю (zip) список состояний столбиков со списком перемещений, при этом список перемещений тут-же на ходу и формируется, ура ленивым вычислениям :) (аналогичным методом, кстати, можно красиво сформировать список чисел Фибоначчи: fib = 1:1:[a+b | (a,b) <- zip fib $ tail fib]). Ну и в main-е я добавил красивый вывод результатов:
|
|