Я начинающий программист в первый год обучения в университете. Мой преподаватель попросил нас провести некоторое исследование рекурсивного алгоритма и сделать его не рекурсивным. Нет смысла, насколько я стараюсь, это кажется невозможным. Вопрос читаетРекурсивная перестановка, Эллис Горовиц Алгоритмы и структура данных Путаница.
А представляет собой строку символов (например, А = «Привет») и обмен, который является абстракция, обменивается к-й с г-го символа А, например, CALL-обмен («привет», 2, 3) изменит «привет» на «hlelo»).
Идея заключается в том, чтобы напечатать все возможные перестановки Версию в 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, который кажется только появиться в Horowitz книге «алгоритмы и структуры данных ". Он поставил вопрос в 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
Любой рекурсивный алгоритм может быть преобразован в итерационной форме, обернув все в цикле в то время и с помощью структуры стека для отслеживания «рекурсии». –