[pascal] Rekurencja

0

Napisalem rekurencyjna procedure do tworzenia listy, ale dla dlugiej listy nastepuje przepelnienie stosu. Problem jest nastepujacy: trzeba przerobic rekurencje na petle (najlepiej while). Najwazniejsze zeby procedura miala identyczne dzialanie. Wydaje sie proste ale...
Ponizej jest procedura, jesli ktos wie jak to powinno wygladac po przerobce bardzo prosze o pomoc (moze ktos mnie chociaz naprowadzi zebym znalazl blad).

procedure dodaj(var head:wsk;d:SearchRec);
var nowy:wsk;
begin
if head = nil then
begin
new(head);
head^.plik := d;
head^.nast := nil;
exit;
end;
if (IsDir(d.attr) and IsDir(head^.plik.attr))
or ((not IsDir(d.attr)) and (not Isdir(head^.plik.attr)))
or (IsDir(d.attr) and (not IsDir(head^.plik.attr)))
then
begin
if ((head^.plik.name > d.name))
or (IsDir(d.attr) and (not IsDir(head^.plik.attr)))
then
begin
new(nowy);
nowy := head;
head^.plik := d;
head^.nast := nowy;
exit;
end;
end;
dodaj(head^.nast,d);
end;

Jeszcze jakby co deklaracja typow:

type wsk = ^element;
element = record
plik:SearchRec;
nast:wsk;
end;

A funkcja IsDir ma postac:

function IsDir(attr:byte):boolean;
begin
if (attr shr 4) mod 2 0 then IsDir := true else IsDir := false;
end;

0

To moze prosciej. Jak w ponizszej procedurze pozbyc sie rekurencji:

procedure dodaj(var head:wsk;d:SearchRec);
begin
if {jakis warunek} then
begin
{jesli warunek spelniony to jakas akcja i wyjscie}
exit;
end;
dodaj(head^.nast,d);
end;

0

Użyj stosu, na który będziesz odkładał wskaźniki.

0

Chodzilo mi o przerobienie podanej procedury rekurencyjnej na "nie rekurencyjna", lub przynajmniej o wskazowki jak to zrobic.
Użyj stosu, na który będziesz odkładał wskaźniki.
Odkładanie wskaznikow na stosie niewiele mi w tym wypadku mowi.
:-(

0

Chodzilo mi o przerobienie podanej procedury rekurencyjnej na "nie rekurencyjna", lub przynajmniej o wskazowki jak to zrobic.
Użyj stosu, na który będziesz odkładał wskaźniki.
Odkładanie wskaznikow na stosie niewiele mi w tym wypadku mowi.
:-(

Zamiast niejawnie używać stosu (czyli przy rekurencji) używaj go jawnie (ręcznie odkładaj dane). Musisz w tym celu utworzyć sobie drugą strukturę w postaci stosu:
type PStos = TStos;
TStos = record
head: wsk;
d: SearchRec;
Nastepny: PStos;
end;

var Stos: PStos;

i odkładaj na niego kolejne wartości:

procedure dodaj(var head:wsk;d:SearchRec);
begin
while not {jakis warunek} do
begin
Stos <= head, d;
end;
{jesli warunek spelniony to jakas akcja i wyjscie}
end;

To oczywiście jest źle skonstruowana procedura, ponieważ nie zdejmuje ze stosu. To jak dokładnie zrobić zależy od konkretnej procedury. Musisz analogicznie przerobić swoją procedurę. Niestety nie mam dziś czasu na napisanie twojej procedurki. Mam nadzieję, że wskazówki wystarczą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1