PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Doppelte Hash Werte bei Fibonacci



zielscheibe
22-05-2006, 12:55
Hallo NG!

Wollte eingentlich nur was Testen, bin aber auf ein
seltsames Phänomen gestoßen.
Habe das Skript in anderer Form auf einer Seite
gefunden. Dann wollte ich aber, daß die Zahlen
in einer Reihe ausgegebn werden. Die erste Idee war, daß ich Zahlen
in einen Hash einfüge und dann nur noch neue dabei
kommen, weil es den Schlüssel ja schon gibt.
Das funktioniert, aber jeder Wert ist 2x drin :confused:
Hab ich was verdreht oder gibt es ein Problem mit Rekursivität
und dem Hash ?




#!/usr/bin/perl -w

use strict;
my %hash;

chomp(my $n=$ARGV[0]);

print "\nDie $n-Fibonacci-Zahl ist ".&fibonacci($n)."\n";
foreach my $key (sort numerisch %hash) {
print "$hash{$key} \n";
}

sub numerisch{ $a <=> $b}

sub fibonacci{
my $n=shift;
$hash{$n} = $n;

if ($n<=2) {
return 1;
}
else {
return &fibonacci($n-1)+&fibonacci($n-2);
}
}

michael.sprick
23-05-2006, 07:28
Das Problem liegt in Deiner foreach-Schleife.
In Perl sind Arrays und Hashes vom Aufbau her identisch... beides sind Listen.

%Hash = ( "key1","wert1", "key2", "wert2", "key3", "wert3", "key4", "wert5");
@Array = ( "wert1", "wert2", "wert3", "wert4", "wert5", "wert6" );

wenn Du Dich nun mit foreach() durch das Hash oder das Array hangelst, wird jedes Element einmal angesprochen. Für das Hash bedeutet das, dass so erstmal nicht unterschieden wird, ob es sich um key oder value handelt.

Darum gibt es die Funktionen keys() und values(), die, auf ein Hash angewandt, entweder die ungeraden oder die geraden Elemente zurückgeben.

richtig wäre also:


foreach my $Key (keys(%Hash))
{
print "$Hash{$Key}\n";
}

oder


foreach my $Value (values(%Hash))
{
print "$Value\n";
}



Gruß, Michael

zielscheibe
23-05-2006, 13:15
richtig wäre also:


foreach my $Key (keys(%Hash))
{
print "$Hash{$Key}\n";
}
Gruß, Michael

Hallo Michael!
Keine Ahnung warum ich "keys" in der Schleife vergessen habe :confused:
Aber wiedermal was gelernt dabei :D
Merci