Еще одно домашнее задание. Передай мне свой учитель А;)
Источник: http://www.soc.napier.ac.uk/~andrew/hanoi/rechelp.html
Бонус: пошаговое видео на YouTube .
Немного о Ханойской башне
Анализ этого и обсуждение (изобретенной) мифологии и версии с четырьмя колышками можно найти в rec.puzzles FAQ ищите индукция / hanoi.s
У проблемы Ханойской башни есть хорошее рекурсивное решение.
Разработка рекурсивных решений
Чтобы решить такие проблемы, спросите себя: «Если бы я раскрыл дело n-1 , мог бы я решить дело n ?»
Если ответ на этот вопрос положительный, вы исходите из возмутительного предположения, что дело n-1 было раскрыто. Как ни странно, это работает, если есть некоторый базовый случай (часто, когда n равен нулю или единице), который можно рассматривать как особый случай.
Как переместить n колец с полюса A на полюс C?
Если вы знаете, как переместить n-1 колец с одного полюса на другой, просто переместите n-1 колец на запасной полюс - остается только одно кольцо на полюс источника теперь просто переместите его в пункт назначения, а затем сложите остальные из запасного полюса в столб назначения.
Например, когда n равно 4 ...
Сначала переместите три на запасной столб (подумайте, как это сделать позже).
Теперь переместите одно кольцо от полюса источника к полюсу назначения.
Теперь переместите три кольца от запасного полюса к полюсу назначения
(опять же, мы можем беспокоиться о том, как сделать это позже).
Мы закончили!
Более кратко ...
Для перемещения n колец из А в С, используя В в качестве запасного:
- , если n равно 1
- в противном случае ...
- переместить n-1 колец от A до B, используя C как запасной
- переместить одно кольцо от А до С
- переместить n-1 кольца от B до C, используя A в качестве запасного
Как и в большинстве рекурсивных решений, мы должны специально обработать некоторый базовый случай - здесь базовый случай возникает, когда у нас есть только одно кольцо для перемещения.
Как это сделать в C
/* Tower of Hanoi - the answer */
/* How to move four rings from pin 1 to pin 3 using pin 2 as spare */
#include <stdio.h>
void move(n, A, C, B)
/* number to move, source pole, destination pole and
spare pole respectively */
int n, A, B, C; {
if (n == 1) {
printf("Move from %d to %d.\n", A, C);
} else {
move(n - 1, A, B, C);
move(1, A, C, B);
move(n - 1, B, C, A);
}
}
main() {
move(4, 1, 3, 2);
}