У меня вопрос по линейным башням Ханоя.

Я реализовал это на С++, но пытаюсь сделать то же самое, используя хвостовой рекурсивный или итеративный метод. У меня проблемы с алгоритмом.

Этот фрагмент кода показывает перемещение блоков из средней башни в конечную.

#include <stdlib.h>
#include <stdio.h>
using namespace std;

//int a[5]={2,3,1,2,1};
int from,spare,to;

int main()
{
//int n;

//void hanoi(int,int,int,int);
void linear_hanoi(int,int,int,int);
void mid_to_end(int,int,int,int);
void end_to_mid(int,int,int,int);
//mid_to_end(3,2,3,1);
end_to_mid(4,3,2,1);
getchar();
return 0;
}

void linear_hanoi(int n, int from, int to, int spare)
{
     if(n>0)
      {
            linear_hanoi(n-1,from,to,spare);
            cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<spare<<endl;
            linear_hanoi(n-1,to,from,spare);
            cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<to<<endl;
            linear_hanoi(n-1,from,to,spare);
      }
}
void mid_to_end(int n, int from, int to, int spare)
{
  if(n>0)
  {
     mid_to_end(n-1,from,spare,to);
     cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<to<<endl;
    // mid_to_end(n-1,spare,from,to);
   //  mid_to_end(n-1,from,to,spare);
   //cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
  // mid_to_end(n-1,from,to,spare);
    //cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
 }
}

Что я делаю не так?

1
user181266 20 Окт 2009 в 21:47
2
Даже если это не так, это чья-то домашняя работа; обозначив это как таковое.
 – 
George Stocker
20 Окт 2009 в 21:50
1
Нет, я должен был написать исследовательскую работу... сравнивая рекурсию и хвостовую рекурсию
 – 
user181266
20 Окт 2009 в 21:52
5
Это звучит как домашнее задание для меня.
 – 
Carl Norum
20 Окт 2009 в 21:55
1
Это не домашнее задание, чувак.. я просто хочу, чтобы логика делала это в итеративной или хвостовой рекурсии
 – 
user181266
20 Окт 2009 в 21:58
1
Кого, черт возьми, волнует, домашнее задание это или нет? Это не вопрос «пришлите мне код», так зачем беспокоиться?
 – 
innaM
20 Окт 2009 в 22:31

2 ответа

Из википедии:

Простое решение: Следующее решение является простым решением для игрушечной головоломки.

Попеременные ходы между самой маленькой фигурой и не самой маленькой фигурой. При перемещении наименьшей части всегда двигайте ее в одном направлении (вправо, если начальное количество частей четное, влево, если начальное количество частей нечетное). Если в выбранном направлении башни нет, переместите фигуру в противоположный конец, но затем продолжайте движение в правильном направлении. Например, если вы начали с трех частей, вы должны переместить самую маленькую часть в противоположный конец, а затем продолжить движение в левом направлении. Когда очередь состоит в том, чтобы переместить не самую маленькую фигуру, разрешен только один ход. Это должно завершить головоломку, используя для этого наименьшее количество ходов.

1
Luka Rahne 21 Окт 2009 в 01:35

Вы можете преобразовать код в стиль передачи продолжения. Тогда все хвост-рекурсивно...

0
Thomas Danecker 27 Ноя 2009 в 23:50