Рекурсивная перестановка, алгоритмы Эллиса Горовица и структура данных Путаница.

Я начинающий программист на первом курсе университета. Мой преподаватель попросил нас провести исследование рекурсивного алгоритма и сделать его не рекурсивным. Нет, как бы я ни старался, это кажется невозможным. Вопрос гласит

A - это строка символов (например, A = "hello"), и interchange, являющийся абстракцией, заменяет k-тый символ i-м символом A, например, CALL interchange("hello", 2, 3) изменится " привет "на" привет ").

Идея состоит в том, чтобы распечатать все возможные перестановки. Версия на C++ читает

void perm(char*a, const int k, const int n)
{
  if(k==n)
  {
    cout << a;
  }
  else
  {
    for (i=k;i<=n;i++)
    {
      interchange(a, k, i);
      perm(a, k+1, n)
    }
  }
 }

Мой репетитор предпочитает использовать язык ADL, который, кажется, появляется только в книге Горовица "Алгоритмы и структуры данных". Он поставил вопрос в ADL, поэтому я добавлю и этот код, его очень легко понять.

proc perm(IN a, IN k, IN n)
  if k=n then
    print(a)
  else
    {
     for i <- k to n do
       call interchange(a,k,i)
       call perm( a, k+1, n)
     end
    }
end

спасибо всем, кто может помочь. Martyn

2 ответа

Решение

Рекурсивный алгоритм - это просто алгоритм, использующий стек.

Рекурсия позволяет использовать стек вызовов в качестве стека данных.

Любая рекурсивная функция, принимающая эту форму:

void perm(char*a, const int k, const int n)
{
   // check if your code should return

   // make a recursive call with new data
}

Может быть изменено на это:

void perm(char*a, const int k, const int n)
{
   // Create a stack, push (a,k,n)

   while ( /* stack isn't empty */ )
   {
       // check if stack should be *popped* (instead of returning)

       // Put new data on the stack (instead of recursing)
   }
}

Вот подсказка, не выполняя за вас домашнее задание. Когда вы идете по цепочке, глядя на i-й символ, вы попадаете в одно из трех возможных состояний:

  • я == к
  • я == н
  • еще

Что вы печатаете в каждом из этих трех случаев?

Другие вопросы по тегам