myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Perl Rekursion "Fibonnacci"

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 26.09.13, 18:30   #1
savasabi
Anfänger
 
Registriert seit: Sep 2012
Beiträge: 8
Bedankt: 2
savasabi ist noch neu hier! | 0 Respekt Punkte
Standard Perl Rekursion "Fibonnacci"

Hallo,

kann mir jemand erklären, wie das Programm zu dem unten genannten Ergebnis kommt?Ich versteh den Rechenweg nicht.
Also der erste Wert ist klar, ist der Zähler von der Schleife. Aber der zweite Wert, ich versteh nicht wie es zu diesen Zahlen kommt.

---------------------------------------------------------------
sub fibonacci{

my($value)=@_;
return 1 if $value <= 2;
return fibonacci($value -1)+fibonacci($value -2);
}
print "$_: ", fibonacci($_), "\n" for (1 .. 7);

-----------------------------------------------------------------
Die Ausgabe ist folgende:

1: 1
2: 1
3: 2
4: 4
5: 8
6: 16
7: 32

Danke im Vorraus
savasabi ist offline   Mit Zitat antworten
Ungelesen 26.09.13, 20:42   #2
rollmops70
Anfänger
 
Registriert seit: May 2012
Beiträge: 1
Bedankt: 2
rollmops70 ist noch neu hier! | 0 Respekt Punkte
Standard

Komisch, ich kenn fibonacci anders-
-> wikipedia
Die Fibonacci-Folge ist eine unendliche Folge von Zahlen (den Fibonacci-Zahlen), bei der die Summe zweier benachbarter Zahlen die unmittelbar folgende Zahl ergibt: 0, 1, 1, 2, 3, 5, 8, 13, …


Bei deiner Formel ist aber das neue Ergebnis das Quadrat der vorhergehenden Zahl.

Ich denke Mal der Fehler liegt da begraben
return fibonacci($value -1)+fibonacci($value -1);

Eher so
return fibonacci($value -1)+fibonacci($value);
rollmops70 ist offline   Mit Zitat antworten
Ungelesen 26.09.13, 21:46   #3
savasabi
Anfänger
 
Registriert seit: Sep 2012
Beiträge: 8
Bedankt: 2
savasabi ist noch neu hier! | 0 Respekt Punkte
Standard

ja also da war ein kleiner Fehler in dem Code hab es korrigiert.
und zwar steht bei uns im Skript folgendes

return fibonacci($value -1)+fibonacci($value -2);
savasabi ist offline   Mit Zitat antworten
Ungelesen 26.09.13, 21:51   #4
spartan-b292
Echter Freak
 
Benutzerbild von spartan-b292
 
Registriert seit: Mar 2010
Ort: /home/spartan-b292
Beiträge: 2.856
Bedankt: 1.701
spartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punkte
Standard

Was ist jetzt eigentlich dein Problem?

Wenn ich deinen Code, wie er im 1. Post steht, ausführe bekomme ich als Ausgabe:
1: 1
2: 1
3: 2
4: 3
5: 5
6: 8
7: 13

Was der Fibonaccifolge entspricht.
Oder hat sich deine Frage jetzt von selbst beantwortet weil du den Code falsch aus dem S***** abgetippt hast?
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
spartan-b292 ist offline   Mit Zitat antworten
Ungelesen 27.09.13, 06:52   #5
savasabi
Anfänger
 
Registriert seit: Sep 2012
Beiträge: 8
Bedankt: 2
savasabi ist noch neu hier! | 0 Respekt Punkte
Standard

Also ich versteh nicht genau wie das Programm auf die fibonacci Zahlen kommt.
Klar ist auch die Ausgabe für den ersten und zweiten Durchlauf.
Was mir Probleme bereitet ist, wenn sich die Funktion immer wieder selbst aufruft wird $value doch immer kleiner, ich dachte das die Funktion sich immer wieder selbst aufruft bis $value = 1 ist und dann ausgegeben wird. Das kann ja aber nicht sein. Kann mir jemand z.B. mal für den 6. Schleifendurchlauf erklären, wie man dauf das Ergebnis 8 kommt, bzw. wie das Programm das rechnet in einzelnen Schritten so das ich es nachvollziehen kann.

1: 1
2: 1
3: 2
4: 3
5: 5
6: 8
7: 13
savasabi ist offline   Mit Zitat antworten
Ungelesen 27.09.13, 22:48   #6
ProgMaster
Banned
 
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
ProgMaster ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von savasabi Beitrag anzeigen
Kann mir jemand z.B. mal für den 6. Schleifendurchlauf erklären, wie man dauf das Ergebnis 8 kommt, bzw. wie das Programm das rechnet in einzelnen Schritten so das ich es nachvollziehen kann.
Wie wäre es wenn du dir selbst die Mühe machst und damit deine Frage selbst beantwortest?

Nimm Stift und Papier in die Hand oder notier es am besten gleich hier...
ProgMaster ist offline   Mit Zitat antworten
Ungelesen 28.09.13, 22:03   #7
savasabi
Anfänger
 
Registriert seit: Sep 2012
Beiträge: 8
Bedankt: 2
savasabi ist noch neu hier! | 0 Respekt Punkte
Standard

also wenn ich es so durch gehe schreibe ich folgendes auf

Zum Beispiel für den Schleifendurchlauf mit 6 es ruft sich doch immer wieder selber auf und $value wird immer niedriger vom Wert:

fibonacci(6-1) + fibonacci(6-2)
fibonnacci(5) + fibonacci(4)

fibonacci(5-1) + fibonacci(4-1)
fibonacci(4) + fibonacci(3)

fibonacci(4-1) + fibonacci(3-1)
fibonacci(3) + fibonacci(2)

fibonnacci(3-1) + fibonnacci(2)= 1
fibonnacci(2)=1 + 1
= 2

Nach meinem Verständnis kann doch immer nur 2 ausgegeben werden? Wo habe ich den Denkfehler?
savasabi ist offline   Mit Zitat antworten
Ungelesen 28.09.13, 22:23   #8
Zerafir
Anfänger
 
Registriert seit: Jul 2009
Beiträge: 28
Bedankt: 20
Zerafir ist noch neu hier! | 0 Respekt Punkte
Standard

Dein Fehler ist, dass du denkst, dass nur die letzten zwei aufrufe der Funktion einen Wert zurückgeben, welche addiert und an die printfunktion übergeben werden.
Tatsächlich gibt aber die Funktion den Wert an die Funktion wieder von der sie aufgerufen wurde.

Ich gehs mal mit Aufruf 4 durch ( 6 ist mir zu viel zum schreiben)
fib(4)

fib(4-1) + fib(4-2) [ diese beiden wurden von fib(4) aufgerufen ]

fib(3-1) + fib(3-2) [ diese beiden wurden von fib(4-1) aufgerufen ]
[ fib(4-2) ruft keine Funktion auf sondern gibt den Wert 1 zurück da value<=2 ist ]

[ fib(3-1) ruft keine Funktion auf sondern gibt den Wert 1 zurück da value<=2 ist ]
[ fib(3-2) ruft keine Funktion auf sondern gibt den Wert 1 zurück da value<=2 ist ]

[ da fib(3-1) und fib(3-2) jeweils den Wert 1 an fib(4-1) zurückgeben werden diese in
fib(4-2) aufaddiert zu 2 und dieser Wert zurückgegeben )

[ somit gibt fib(4-2) den Wert 2 an fib(4) zurück und fib(4-2) gibt den Wert 1 an fib(4)
zurück. beide Werte werden in fib(4) aufaddiert zu 3 und zurückgeben an die
printfunktion. ]

[ print erhält den Wert 3 und gibt diesen auf ]


So in etwa sollte das ganze aussehen.
Zerafir ist offline   Mit Zitat antworten
Ungelesen 28.09.13, 22:26   #9
NetWebs
Banned
 
Registriert seit: Aug 2012
Beiträge: 223
Bedankt: 68
NetWebs ist noch neu hier! | 0 Respekt Punkte
Standard

Nimm mal wirklich Stift und Papier in die Hand und rechne Zeile für Zeile!
Entweder warst du faul oder extrem unkonzentriert und kommst daher auf die total falsche Lösung.

Also: Konzentrier dich, schreib auf...dann findest Du auch die Lösung!
NetWebs ist offline   Mit Zitat antworten
Ungelesen 01.10.13, 20:49   #10
savasabi
Anfänger
 
Registriert seit: Sep 2012
Beiträge: 8
Bedankt: 2
savasabi ist noch neu hier! | 0 Respekt Punkte
Standard

ahh ich glaube ich habe es verstanden. Es entstehen immer wieder neue "Verzweigungen, welche eine 1 zurückliefern, umso höher die Eingabe-->umso mehr verzweigungen....vielen Dank für eure Hilfe, spezieller dank geht an Zerafir!!
savasabi ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.


Sitemap

().