Program fibo2.c ilustruje mechaniczne eliminowanie rekursji przy pomocy stosu.
Wzorując się na programie fibo2.c przekształcić następujące rekursywne procedury na iteracyjne (ze stosem):
int
asilnia(int n, a)
{
if (n < 2) {
return a;
} else {
return asilnia(n - 1, n*a);
}
int
silnia(int n)
{
return asilnia(n, 1);
}
fib(5) = 8
fib(4) = 5
fib(3) = 3
fib(2) = 2
fib(1) = 1
fib(0) = 1
fib(1) = 1
fib(2) = 2
fib(1) = 1
fib(0) = 1
fib(3) = 3
fib(2) = 2
fib(1) = 1
fib(0) = 1
fib(1) = 1
Tzn. każde wywołanie ma być w odzielnej linii, podając argumenty i wynik.
Poniżej mają być wywołania rekursywne, z wcięciami pokazującymi poziom
rekursji: wszystkie wywołania są wciętę o cztery spacje w stosunku do
funkcji wywołującej.
Jak przekształcić daną funkcję, tak by wypisać to drzewo. Przy tym
chcemy mało zmienić funkcję, ale też chcemy uniknąć wielokrotnego
wywoływania danej funkcji.
Wskazówka: zapamiętać argumenty i wyniki na stosie, samo drzewo wypisać w oddzielnej pętli.