2010-07-27 11 views
1

J'ai écrit une fonction d'arbre récursive dans pascal (ou delphi) mais j'avais un message 'Mémoire insuffisante' quand je l'ai exécuté. je dois activer la fonction récursive Calculer dans ce code à la fonction non récursive, pouvez-vous me dire comment s'il vous plaît:Comment convertir une fonction récursive arborescente (ou un algorithme) en une boucle?

program testing(input,output); 
type 
    ptr = ^tr; 
    tr = record 
    age:byte; 
    left,right:ptr; 
    end; 
var 
    topper:ptr; 
    total,day:longint; 
procedure mycreate(var t:ptr); 
var temp:ptr; 
begin 
    new(temp); 
    temp^.age:=1; 
    temp^.left:=nil; 
    temp^.right:=nil; 
    t:=temp; 
end; 
procedure gooneday(var t:ptr); 
begin 
    if t^.age<>5 then 
    begin 
     if t^.age=2 then 
     mycreate(t^.left) 
     else if t^.age=3 then 
     mycreate(t^.right); 
     t^.age:=t^.age+1; 
     total:=total+1; 
    end; 
end; 

procedure calculate(var crnt:ptr); 
begin 
    if crnt<>nil then 
    begin 
     gooneday(crnt); 
     calculate(crnt^.left); 
     calculate(crnt^.right); 
    end; 
end; 

begin 
    total:=0; 
    mycreate(topper); 
    day:=0; 
    while total<1000000000000 do 
    begin 
     total:=0; 
     day:=day+1; 
     calculate(topper); 
    end; 
    writeln(day); 
    writeln(total); 
end. 
+1

Veuillez éditer votre question. Veuillez lire les instructions sur le côté droit de la page pour le formatage du code. –

Répondre

4

fonctions récursives utilisent une pile pour maintenir l'état de la récursion.

Lors de la conversion en boucle, vous devez créer une pile explicite. Vous devez pousser et sortir les éléments de la pile dans la boucle.

+0

Petite note: dans ce cas (avec plusieurs appels récursifs par itération) ceci est vrai, mais une simple autorecursion peut souvent être réécrite sans pile ou autre état dépendant de N. –

2

Vous pouvez traverser l'arbre dans un espace constant. Vous pouvez voir au this disscussion.

+1

Traverser dans l'espace constant avec cette technique implique de donner à chaque nœud un pointeur parent . C'est bien et tout jusqu'à ce que vous vouliez commencer à copier des nœuds par référence (plutôt que de copier en profondeur). Lorsque vous faites d'un noeud un enfant de plusieurs arbres, il ne peut plus avoir un seul pointeur parent correct. Avant d'aller sur la route du pointeur parent, prenez le temps de réfléchir si vous pouvez ou non faire référence plusieurs fois au même nœud dans un arbre. –