Никита К.
1594 сообщения
#14 лет назад
Вот допустим надо преобразовать рекурсивную функцию к итеративной, заменив использование машинного стека - собственным.

То есть, есть 3 функции работы со стеком (push(int a) - ложит элемент на верхушку стека, pop() - возвращает последний и удаляет его, empty() проверяет стек на пустоту)

И есть рекурсивная функция
int f(int a) {
if(a == 0) return;
printf("%d", a);
f(a-1);
f(a-1);
printf("%d", a);
}


2 часа промучался над возможной реализацией итеративной функции. Итог правильно работает только для a = 0, a = 1, a = 2;

void f(int a) {
while( a || !empty()) {
if(!a) a = pop();
else push(a);

printf("%d", a--);
if(a) {
push(a);
printf("%d", a);
}
}
}


Вроде бы принцип понял, но вот как реализовать его для функции, которая 2 раза вызывает саму себя с одним и тем же параметром - понять не могу((

Может кто-нибудь подсказать что я делаю не так?
Артём К.
1157 сообщений
#14 лет назад
Циклов должно быть 2.
Выполняться они должны по очереди, сначала первый, потом второй.
Первый цикл проходит по первому вызову f(a-1), второй по второму вызову f(a-1).
Никита К.
1594 сообщения
#14 лет назад
superkoder, тоже об этом подумал. Но вот как именно - понять не могу((