Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11919[/thread]

Rekursive Berechnung der Fakultät

Leser: 2


<< >> 8 Einträge, 1 Seite
Array
 2008-05-27 13:13
#110347 #110347
User since
2008-02-27
6 Artikel
BenutzerIn
[default_avatar]
Hallo liebe Leute,

ich habe mal versucht die Fakultät iterativ und rekursiv zu berechnen.
Beides funktioniert auch!!!
Ich hätte nur mal eine spezielle Frage zur Rekursion.

Zum Verständnis: Ist es richtig, wenn ich behaupte die Funktion ruft sich in der Funktion immer wieder selbst auf? Der Wert von $zahl wird jeweils um 1 erniedrigt und wieder der Subroutine übergeben.
Das geht solange bis der Wert von $zahl 0 erreicht. Warum gibt er mir dann trotzdem den richtigen Wert aus und nicht 1 (ich meine hierbei die Zeile return 1 if $zahl == 0;)
In welcher Variablen steht denn eigentlich das Ergebnis der Multiplikation??
Irgendwie blicke ich da nicht ganz durch :-)



Hier der Auszug:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
if ($ir eq "R") {
print "Wert eingeben: ";
chomp($wert = <STDIN>);
print "Das Ergebnis lautet: " ,fakrek($wert),"\n";
}

sub fakrek {
my $zahl =shift ;
return undef if $zahl < 0;
return 1 if $zahl == 0;
return ($zahl * rek ($zahl -1));
}



Vielen Dank für euere Hilfe!!


Gruß

Array
renee
 2008-05-27 13:26
#110349 #110349
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Array+2008-05-27 11:13:01--
Zum Verständnis: Ist es richtig, wenn ich behaupte die Funktion ruft sich in der Funktion immer wieder selbst auf?
ja
Quote
Der Wert von $zahl wird jeweils um 1 erniedrigt und wieder der Subroutine übergeben.
ja
Quote
Das geht solange bis der Wert von $zahl 0 erreicht. Warum gibt er mir dann trotzdem den richtigen Wert aus und nicht 1 (ich meine hierbei die Zeile return 1 if $zahl == 0;)
In welcher Variablen steht denn eigentlich das Ergebnis der Multiplikation??
In keiner aus Deinem Programm. Das handelt Perl intern.
Quote
Irgendwie blicke ich da nicht ganz durch :-)
Rekursion ist für "Rekursions"-Einsteiger immer etwas verwirrend.

Die Variable $zahl im ersten Aufruf der Funktion ist vom Speicherplatz her ungleich der Variable $zahl im zweiten Aufruf der Funktion. Für uns sieht es immer nach der gleichen Variablen aus. Aber das ist nur der "Name", den wir sehen.

Das ist so, als ob Du durch eine Reihe von Räumen gehst. In jedem sitzt ein "Herr Meier", aber das ist nie derselbe. Der Name "Herr Meier" ist zwar gleich, aber es ist dennoch immer eine andere Person.

OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
moritz
 2008-05-27 14:04
#110353 #110353
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich hab auch mal ein bisschen über Rekursion geschrieben, vielleicht hilfts ja (auch wenn die Beispiele in C/C++ sind, nicht in Perl)
pktm
 2008-05-27 14:15
#110354 #110354
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
renee+2008-05-27 11:26:26--
Das ist so, als ob Du durch eine Reihe von Räumen gehst. In jedem sitzt ein "Herr Meier", aber das ist nie derselbe. Der Name "Herr Meier" ist zwar gleich, aber es ist dennoch immer eine andere Person.



Das ist ein verdammt gutes Beispiel! (erhlich)
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2008-05-27 15:10
#110358 #110358
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
renee+2008-05-27 11:26:26--
Quote
Der Wert von $zahl wird jeweils um 1 erniedrigt und wieder der Subroutine übergeben.
ja

nein. der wert von $zahl ändert sich nicht. und er wird schon gar nicht erniedrigt (der arme), sondern
wenn dann dekrementiert. also, du änderst nicht $zahl, sondern rufst dieselbe funktion mit dem
argument $zahl -1 auf. das ist ein unterschied. im nächsten funktionsaufruf ist $zahl eine neue
variable, die rein gar nichts mit der äusseren zu tun hat, ausser, dass sie den gleichen namen hat.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
murphy
 2008-05-27 17:11
#110368 #110368
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Array+2008-05-27 11:13:01--
[...] ich habe mal versucht die Fakultät iterativ und rekursiv zu berechnen. [...]


Kleine Anregung: Es ist interessanter und resourcensparender, weil man Stacküberlauf vermeiden kann, die Fakultätsfunktion endrekursiv zu schreiben...

Und nicht an der Rekursion verzweifeln, schließlich gilt ja der bekannte Spruch "To iterate is human, to recurse, divine" ;-)
When C++ is your hammer, every problem looks like your thumb.
moritz
 2008-05-27 17:54
#110378 #110378
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
murphy+2008-05-27 15:11:19--
Und nicht an der Rekursion verzweifeln, schließlich gilt ja der bekannte Spruch "To iterate is human, to recurse, divine" ;-)


Und ebenso "um Rekursion zu verstehen muss man erst Rekursion verstanden haben"
Array
 2008-05-28 23:29
#110420 #110420
User since
2008-02-27
6 Artikel
BenutzerIn
[default_avatar]
Vielen Dank euch allen, jetzt ist es mir wesentlich klarer geworden!
Danke besonders an Moritz für den Artikel zu Rekursion.


MfG

Array
<< >> 8 Einträge, 1 Seite



View all threads created 2008-05-27 13:13.