Czy mógłby mi ktoś pomóc z usunięciem rekurencji z poniższego kodu (program znajduje dwuspójne składowe w grafie)?

 {
  N - liczba wierzcholkow
  D[1..N] - tablica numeracji pre-order
  Low[1..N] - tablica funkcji Low
  C[krawedzie] - tablicy przynaleznosci krawedzi do dwuspojnych skladowych
  }

  procedure Visit(v, father: Integer);
  {dodatkowym parametrem jest wierzch., z ktorego przyszlismy}
  begin
    D[v]:=time;    {przydzielenie numerka w numeracji pre-order}
    Inc(time);
    Low[v]:=D[v];    {Low[v] nie moze byc wieksze niz D[v]}
    for i:=Nieghbour(v) do    {petla po sasiadach wierzch. v}
      if i<>father then  {nie rozwazamy sasiada, z ktorego przyszlismy}
        if D[i]=-1 then    {jesli wierzch. i jest nieodwiedzony}
        begin
          Put_On_Stack(v<->i);  {odkladamy krawedz, po ktorej przejdziemy na stos} 
      **Visit(i,v);**      {przechodzimy rekurencyjnie do wierzch. i}<code>
      if Low[v]>Low[i] then   {oraz badamy Low tego wierzcholka}
        Low[v]:=Low[i];
      if Low[i]>=D[v] then   {wykryto dwuspojna skladowa}
      begin
        Inc(No);     {rozpatrujemy skladowa o kolejnym numerze}
        repeat
          Get_From_Stack(e);   {zdejmij ze stosu kolejna krawedz skladowej}
          C[e]:=No;      {oznacza, ze krawedz nalezy do skladowej o numerze No}
        until e=v<->i;
      end;
    end else     {jesli wierzch. i byl juz odwiedzony}
    begin
      if D[v]>D[i] then   {jesli i jest poprzednikiem v w drzewie}
        Put_On_Stack(v<->i);  {odkladamy "podgladana" krawedz}
      if Low[v]>D[i] then    {badamy numer pre-order wierzch. i}
        Low[v]:=D[i];
    end;

end;

procedure FindConstituent;
begin
for i:=1 to N do
D[i]:=-1; {oznaczamy wszystkie wierzcholki jako nieodwiedzone}
time:=1; {zmienna potrzebna do numeracji pre-order}
No:=0; {zmienna potrzebna do numeracji skladowych}

for i:=1 to N do
  if D[i]=-1 then    {jesli wierzch. i jest nieodwiedzony to ...}
    Visit(i,-1);    {przechodzimy do wierzch. i}

end;


Będę wdzieczny za każdą pomoc. :)