perl et récursivité

Le
ApolloJ
Bonjour,

J'ai un fichier texte du type

T="1.1.1.1,2.2.2.2,3.3.3.3"
U="4.4.4.4,5.5.5.5"
V="Y,Z"
Y="T,U"
Z="6.6.6.6"

Comment utiliser efficacement la récursivité pour avoir une liste d'=
@ip
pour V et Y ?
Y'a-t'il une meilleure solution (sans) ?

Merçi d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #143680
In article ApolloJ
Bonjour,

J'ai un fichier texte du type

T="1.1.1.1,2.2.2.2,3.3.3.3"
U="4.4.4.4,5.5.5.5"
V="Y,Z"
Y="T,U"
Z="6.6.6.6"

Comment utiliser efficacement la récursivité pour avoir une liste d'@ip
pour V et Y ?
Y'a-t'il une meilleure solution (sans) ?


C'est plus un probleme de lazyness (paresse) que de recursivite.

Il y a plusieurs problemes a resoudre dans ton probleme:
- la lecture du fichier.
- l'evaluation des donnees.

Comme tes donnees ne sont pas dans un ordre qui va permettre d'obtenir
directement le resultat, il faudra d'abord les lire, puis evaluer le
resultat... l'eventuel petit probleme, c'est que je suppose que tu
veux quand meme detecter des constructions de style:
U="U"
voire:
U="T"
T="U"
...

une solution simple mais efficace consiste a lire tes donnees initiales
dans un hash, de maniere a avoir:

$h->{T]="1.1.1.1,2.2.2.2,3.3.3.3"
$h->{U}="4.4.4.4,5.5.5.5"
$h->{V}="Y,Z"
$h->{Y}="T,U"
$h->{Z}="6.6.6.6"

puis a faire des remplacements en boucle de chaque lettre par sa valeur
for (values %$h) {
s/[A-Z]/$h->{$&}/eg;
}

reste plus qu'a voir comment s'arreter.

Une autre possibilite consiste a afficher les valeurs au vol, en scannant
chaque entree du hash, et en appelant recursivement la fonction d'affichage
pour chaque sous-lettre rencontree. On utilise alors une technique `de
petit poucet': on utilise un hash auxiliaire, et a chaque entree dans la
fonction, on marque d'un caillou (ou d'un 1) la variable qu'on est en
train de traiter. Comme ca, si on la rencontre a nouveau lors d'un appel
ulterieur, on sait qu'on est parti en recursion infinie...

Voila. J'espere que c'est suffisant pour avancer...

Nicolas George
Le #143679
ApolloJ wrote in message
Comment utiliser efficacement la récursivité pour avoir une liste d'@ip
pour V et Y ?
Y'a-t'il une meilleure solution (sans) ?


Pourquoi cette formulation sent-elle la question scolaire à plein nez ?

Paul Gaborit
Le #143678
À (at) 16 Apr 2007 22:08:07 GMT,
Nicolas George
ApolloJ wrote in message
Comment utiliser efficacement la récursivité pour avoir une liste d'@ip
pour V et Y ?
Y'a-t'il une meilleure solution (sans) ?


Pourquoi cette formulation sent-elle la question scolaire à plein nez ?


Heu... Personnellement, j'enseigne depuis plus de 20 ans et je ne
comprends même pas la question.

Je vois bien qu'il y a ce qu'on pourrait appeler des listes d'adresses
IP (1.1.1.1, ..., 6.6.6.6). Puis d'autres trucs qui utilisent
(peut-être) des listes de valeurs des premiers (T, U).

Mais... L'ordre d'affectation a-t-il de l'importance ? Est-ce qu'on
peut avoir un mixe entre lettres et adresses IP ? Que fait-on si un
nom apparaît sans avoir de valeur ? Et si ce n'est pas une adresse IP
? Et si il y a une boucle auto-référentielle (U="V", V="U") ? En quoi
une solution sans récursivité (ou avec d'ailleurs) serait-elle
meilleure ? En longueur de code ? En vitesse d'exécution ? En taille
mémoire occupée ? En faiclité de lecture ?

PS : en fait, c'est ça d'être ensiegnant. On s'habitue à poser des
questions pas à y répondre ! ;-)

--
Paul Gaborit - Perl en français -

Nicolas George
Le #143578
Paul Gaborit wrote in message
Heu... Personnellement, j'enseigne depuis plus de 20 ans et je ne
comprends même pas la question.


Oh, oui, bien sûr. Il y a probablement plein de contexte qu'ApolloJ a jugé
inutile de recopier.

espie
Le #143577
In article Paul Gaborit

Heu... Personnellement, j'enseigne depuis plus de 20 ans et je ne
comprends même pas la question.


Marrant, les miens doivent etre plus `tordus' alors, je suis passe
maitre en l'art du decryptage des questions incomprehensibles, faut
croire ;-)

kurtz_le_pirate
Le #143576
"Paul Gaborit" de news:
Heu... Personnellement, j'enseigne depuis plus de 20 ans et je ne
comprends même pas la question.


ouf... ça me rassure :)


--
klp

ApolloJ
Le #143573
Bonjour,

C'est vrai que j'ai posté un peu vite !
La question n'a rien de scolaire (;-)) mais c un exercice-type ...
On suppose que le tableau de hachage est construit comme suit

params {T}= "1.1.1.1,2.2.2.2,3.3.3.3"
params {U}= "4.4.4.4,5.5.5.5"
params {V}= "Y,Z"
etc ..

T="1.1.1.1,2.2.2.2,3.3.3.3"
U="4.4.4.4,5.5.5.5"
V="Y,Z"
Y="T,U"
Z="6.6.6.6"

(mais je pensais que ça suffisait pour comprendre le noeud du pb !)
L'ordre d'affectation a-t-il de l'importance ?
NON

Est-ce qu'on peut avoir un mixe entre lettres et adresses IP ?
OUI
Que fait-on si un nom apparaît sans avoir de valeur ?
RIEN

Et si ce n'est pas une adresse IP ?
On l'ignore

Et si il y a une boucle auto-référentielle (U="V", V="U") ?
LA SIGNALER
En quoi une solution sans récursivité (ou avec d'ailleurs) serait-e lle
meilleure ?
En longueur de code ? En vitesse d'exécution ? En taille
mémoire occupée ? En faiclité de lecture ?
TS CES EXPLES PEUVENT DONNER LIEU A DEBAT ...

Mais j'ai trouvé la solution (avec l'aide d'un pote, merçi Christophe !!)

La solution réside dans cette fonction.
@parametres est la liste qui contient les valeurs de %params.


sub scanparams {

my @parametres=@_;
my (@p)=() ;
my %dejavu=();
my $index ='';
my $i=0;

foreach $index (@parametres) {
unless (exists($dejavu{$index})) {
# Bien placé ? je sais pas trop (pour Marc "on utilise un hash
auxiliaire, et a chaque entree dans la
# fonction, on marque d'un caillou (ou d'un 1) la variable qu'on est en
train de traiter"
# Condition d'arret
if (exists($params{$index})) {
@p=split(',',$params{$index});
$dejavu{$index}=1;
splice(@parametres,$i,1,@p);
@parametres=scanparams(@parametres);
}
$i++;
}
else { die "Pb de récursion auto-referentielle ! ->
BOUCLE n"; }
}
return(@parametres);
}


Merçi qd même.

In article Paul Gaborit
Heu... Personnellement, j'enseigne depuis plus de 20 ans et je ne
comprends même pas la question.


Marrant, les miens doivent etre plus `tordus' alors, je suis passe
maitre en l'art du decryptage des questions incomprehensibles, faut
croire ;-)



Alex Marandon
Le #143572
Marc Espie wrote:

In article Paul Gaborit

Heu... Personnellement, j'enseigne depuis plus de 20 ans et je ne
comprends même pas la question.


Marrant, les miens doivent etre plus `tordus' alors, je suis passe
maitre en l'art du decryptage des questions incomprehensibles, faut
croire ;-)


Bah, quelques annees de dev applicatif, et ce genre de formulation vous
paraitra limpide ;-)


Publicité
Poster une réponse
Anonyme