Newsgroup: it.comp.lang.perl
Titolo: algoritmo problematico

Ciao.
Ho un problema che per ora non riesco a risolvere...quindi chiedo, e
soprattutto spero di farmi capire perchè è un casino...
lo script che ho scritto assemblando muduli predefiniti gestisce ( o meglio,
dovrebbe gestire) una serie di "risultati" statistici formattati nel
sequente modo:
risultato    valore statistico
#1            X
#2            X
#3            X
#4            Y
#5            Y
#6            Z
#7            K
...             ...
(nel senso che 1 2 e 3 hanno lo stesso valore, 4 5 lo stesso...e via
dicendo..; inoltre, potrebbero esserci più o meno risultati con valore X,
così come più o meno risultati Y, e così via....).
Siccome i risultati/valori sono ordinati in  maniera decrescente voglio
considerare come MIGLIORI i risultati con i primi due valori più elevati
(cioè tutti quelli con valore X e Y).
La parte di codice problematica è questa:
[...]  #parte di codice che "retriva" i risultati.
while( my $hit = $result->next_hit()) { do something }
che applica ricorsivamente l'istruzione a tutti i 50 risultati in lista,
mentre ovviamente vorrei che l'applicasse ai risultati MIGLIORI. next_hit è
un metodo del modulo che uso e non vorrei modificarlo per questioni di
portabilità.
mi sono incasinato con istruzioni if...elseif e via dicendo e non ne sono
venuto a capo.
avete qualche idea/suggerimento, sempre che sono riuscito a farmi capire?
ste

 che applica ricorsivamente
? Intendevi dire iterativamente, credo.
Scusa ma non ho capito dove hai i valori statistici qui:
 > while( my $hit = $result->next_hit()) { do something }
Inoltre non ho capito se i valori sono esattamente in sequenza come hai 
scritto. Se sì, a naso potresti:
usare 2 variabili: $migliore_X e $migliore_Y
Appena leggi un valore statistico $val che sicuramente è il migliore, 
$migliore_X=$val.
Dal successivo, appena $migliore_X > $val, allora $migliore_Y=$val;
Appena $migliore_Y > $val, allora hai processato tutti quelli almeno 
migliori di Y.

migliori di Y.
la soluzione delle due variabili l'avevo presa in considerazione, ma non ne
ero venuto a capo.
potresti essere piů preciso in merito. grazie infinite in anticipo.

 potresti essere più preciso in merito. grazie infinite in anticipo.
Mancava una terza variabilie... bho, mi è venuto così, spero ti possa 
bastare:
use strict;
use warnings;
my $migliore_X;
my $migliore_Y;
my $step=1;
while (my $line=<DATA>) {
	my ($risultato,$valore_stat)=split/\s+/,$line;
	$migliore_X=$valore_stat if (!$migliore_X);
	if ($step==1 and $migliore_X > $valore_stat) {
		$step=2;
		$migliore_Y=$valore_stat;
	}
	last if ($step==2 and $migliore_Y > $valore_stat);
	print "$risultato - $valore_stat\n";
}
__END__
#1            5
#2            5
#3            5
#4            4
#5            4
#6            3
#7            2

 ha scritto nel messaggio
news:qYnKa.122264$lK4.3...@twister1.libero.it...


 potresti essere piů preciso in merito. grazie infinite in anticipo.
Mancava una terza variabilie... bho, mi č venuto cosě, spero ti possa


... i valori_stat sono in ordine crescente, sorry!
comunque, ho invertito i segni di MAggiore-Minore e modificato qui (>=):
last if ($step==2 and $migliore_Y <= $valore_stat);
Cavolo, adesso funziona a meraviglia...
GRAZIE
PS. penso che anche la mia tesista ti sarà riconoscente!