Рекурсия. Ханойские башни.
Добавлено: 24 фев 2010, 12:42
Рекурсию явно придумал не человек, но от этого явления никуда не уйти.
Не могу понять как сделать рекурсивное решение Ханойских Башен. Решения, что есть в интернете не подходят (хочется самому дойти до понимания вопроса, да и не до конца понятны существующие примеры).
С какой стороны подступиться?
Рассмотрим несколько примеров чтобы попытаться прийти к решению "с конца" (это то, что я расчертил себе на листике дабы попытаться увидеть общие черты, чтобы понять алгоритм):
1 кольцо (n == 1)
| | |
| | |
1 | |
A B C
A -> C
2 кольца (n == 2)
| | |
1 | |
2 | |
A B C
A -> B
A -> C
B -> C
3 кольца (n == 3)
1 | |
2 | |
3 | |
A B C
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
=======
Я пока точно могу сказать, что условием останова рекурсии будет (n == 1). Но только какое действие должно происходить?! При 1 и 3 кольцах последнее кольцо (первое, если решать "с конца") перемещается сразу на третий столбец (A -> C), при 2 кольцах картина как видно другая. Т.е. алгоритм я пока понять не могу.
Объявление функции я вижу следующим:
void hanoi(int n, int first, int mid, int last);
//n - кол-во колец
//first, mid, last - с какого переносим (A), буферный (B) и на какой переносим (C).
Это все наброски, которые я имею, но они не позволяют мне прийти к решению и пониманию как должна здесь работать рекурсия.
Буду признателен за любые наставления, разъяснения.
updated
Небольшое озарение. Делим задачу на более мелкие.
1). Чтобы перенести диск 3 на колышек C, надо перед этим перенести диски 1,2 на колышек B.
2). Чтобы перенести диск 2 на колышек B, надо перенести диск 1 на колышек C
3). Перенос диска 1 на колышек С - это условие останова (n==1).
Следовательно 1) и 2) - это рекурсивные вызовы функции... так-с, в которых окончательно осталось решить что куда и зачем.... пошел рисовать колышки, диски и стрелочки....
Не могу понять как сделать рекурсивное решение Ханойских Башен. Решения, что есть в интернете не подходят (хочется самому дойти до понимания вопроса, да и не до конца понятны существующие примеры).
С какой стороны подступиться?
Рассмотрим несколько примеров чтобы попытаться прийти к решению "с конца" (это то, что я расчертил себе на листике дабы попытаться увидеть общие черты, чтобы понять алгоритм):
1 кольцо (n == 1)
| | |
| | |
1 | |
A B C
A -> C
2 кольца (n == 2)
| | |
1 | |
2 | |
A B C
A -> B
A -> C
B -> C
3 кольца (n == 3)
1 | |
2 | |
3 | |
A B C
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
=======
Я пока точно могу сказать, что условием останова рекурсии будет (n == 1). Но только какое действие должно происходить?! При 1 и 3 кольцах последнее кольцо (первое, если решать "с конца") перемещается сразу на третий столбец (A -> C), при 2 кольцах картина как видно другая. Т.е. алгоритм я пока понять не могу.
Объявление функции я вижу следующим:
void hanoi(int n, int first, int mid, int last);
//n - кол-во колец
//first, mid, last - с какого переносим (A), буферный (B) и на какой переносим (C).
Это все наброски, которые я имею, но они не позволяют мне прийти к решению и пониманию как должна здесь работать рекурсия.
Буду признателен за любые наставления, разъяснения.
updated
Небольшое озарение. Делим задачу на более мелкие.
1). Чтобы перенести диск 3 на колышек C, надо перед этим перенести диски 1,2 на колышек B.
2). Чтобы перенести диск 2 на колышек B, надо перенести диск 1 на колышек C
3). Перенос диска 1 на колышек С - это условие останова (n==1).
Следовательно 1) и 2) - это рекурсивные вызовы функции... так-с, в которых окончательно осталось решить что куда и зачем.... пошел рисовать колышки, диски и стрелочки....