Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

perl et récursivité

8 réponses
Avatar
ApolloJ
Bonjour,

J'ai un fichier texte du type

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

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

Mer=E7i d'avance

8 réponses

Avatar
espie
In article <4623e16e$0$3457$,
ApolloJ wrote:
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...

Avatar
Nicolas George
ApolloJ wrote in message
<4623e16e$0$3457$:
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 ?

Avatar
Paul Gaborit
À (at) 16 Apr 2007 22:08:07 GMT,
Nicolas George <nicolas$ écrivait (wrote):
ApolloJ wrote in message
<4623e16e$0$3457$:
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Nicolas George
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.

Avatar
espie
In article ,
Paul Gaborit <Paul.Gaborit+ wrote:

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 ;-)

Avatar
kurtz_le_pirate
"Paul Gaborit" a écrit dans le message
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

Avatar
ApolloJ
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 <Paul.Gaborit+ wrote:
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 ;-)



Avatar
Alex Marandon
Marc Espie wrote:

In article ,
Paul Gaborit <Paul.Gaborit+ wrote:

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 ;-)