[Roma.pm] xml + tag name
Oha
oha at oha.it
Tue Jul 24 03:09:48 PDT 2007
>efficiente, visto che Perl non ha la tail recursion optimization
a quanto ricordo, la tail recursion e' applicabile solo se la ricorsione e' loop-invariant
se ricordo bene, quindi, in questo caso la ricorsione avviene piu' volte per ogni stato dello stack, e non sarebbe dunque possibile fare tail recursion.
la soluzione di usare un loop (push su una pila di di cose "da fare") a sua volta potrebbe non esser efficiente (per grandi strutture dati, la pila potre diventare enorme)
una soluzione e' farsi un vero e proprio stack applicativo, mi capito' di scrivere codice del genere in C usando puntatori a struct. senza usare OOP un esempio in perl e' quanto segue:
$ref = XMLin('<opt><a/><b><b1 d="0"/></b><c><c1/></c></opt>');
my @stack = ([$ref, [keys %$ref]]);
my $sp = 0;
while($sp>=0)
{
my $r = $stack[$sp][0];
my $next = shift @{$stack[$sp][1]};
if($next)
{
print "child $next...n";
$sp++;
my $r2 = $r->{$next};
$stack[$sp] = [$r2, [keys %$r2]];
}
else
{
$sp--;
}
}
ogni elemento di @stack contiene lo "stato" dello stack in quel punto. la "shift" simula un ciclo prelevando il prossimo elemento nella lista di cose da fare, e $sp (come potra' suggerire il nome) e' lo stack pointer.
Oha
More information about the Roma
mailing list