Fonction récursive pour obtenir un arbre
Bonjour à tous,
Problème :
Imaginons que j'aie un tableau tel que :
Code:
my @tab = ("h1","p","p","h1","p","h2","p","h1","p");
où :
- h1 = titre de niveau 1
- p = paragraphe
- h2 = titre de niveau 2
J'aimerais obtenir un arbre tel que :
h1
---p
---p
h1
---p
---h2
--- ---p
h1
---p
de manière à ce que les "h1" soient coordonnés aux autres "h1", les "p" subordonnés au dernier "h_x" rencontré (et coordonnés entre "p") et les "h2" soient subordonnés aux "h1".
Dis autrement, à partir d'une séquence de scalaires représentant les éléments d'un document numérique, j'aimerais créer un arbre représentant la logique de ce document.
Ma première solution :
Il me paraît évident qu'il est nécessaire dans ce cas d'écrire une fonction récursive. Cependant, je cale à faire quelque chose qui fonctionne.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| my @tab = ( "h1", "p", "p", "h1", "p");
&recursiv(0, "root");
my $last_indice;
sub recursiv {
my ($indice, $previous) = @_;
my $transition = &rules($indice, $previous);
if($transition eq "sub"){
print "<div>\n";
my $new_indice = $indice + 1;
$last_indice = &recursiv($new_indice, $tab[$indice]);
print "</div>\n";
}
elsif($transition eq "coord"){
print "\t<$tab[$indice]>\n";
print "\t</$tab[$indice]>\n";
}
elsif($transition eq "up"){
# On remonte au dernier appel de la fonction
return $indice;
}
}
# h1 - p : subordonné
# p - p : coordonné
# p - h1 : on remonte
sub rules{
my ($indice, $previous) = @_;
if($tab[$indice] eq "h1" && $previous eq "root"){
return "sub";
}elsif($tab[$indice] eq "p" && $previous eq "h1"){
return "sub";
}elsif($tab[$indice] eq "p" && $previous eq "p"){
return "coord";
}elsif($tab[$indice] eq "h1" && $previous eq "p"){
return "up";
}
} |
Avez-vous un conseil à me donner?
D'avance, merci.