Seite 1 von 1
Frage zur Rekursion!
Verfasst: Freitag 25. Januar 2008, 18:18
von söan
Hallo,
wir haben gerade in der Schule im Fach INFO mit dem Thema Rekursionen
in Python angefangen und auch schon gleich eine hausaufgabe aufbekommen. Doch bei dieser steh ich etwas auf dem Schlauch und wollte deßhalb einmal hier nachfragen.
Undzwar haben wir in Python ein kleines Programm programmiert, das diesen Algorithmus forsetzt (1,1,2,3,5,8,13,21...) und unsere Hausaufgabe dabei ist es uns Gedanken zu machen dies in eine Rekursion zu setzen oder so.
Doch ich habe keinerlei Ahnung wie dies in Python geht.
Ich kenne nur noch Rekursionen von LOGO.
Dies ist unser Programm:
Code: Alles auswählen
def fib ():
a=1
b=1
for n in range (0, 50):
c=a+b
a=b
b=c
print b
fib()
Ich hoffe einmal ihr könnt damit etwas anfangen.
Wäre sehr lieb, wenn mir jemand helfen könnte.
Falls Fragen bestehen, bitte Posten.
Danke im vorraus.
Mit freundlichen Grüßen
Söan
Edit (BlackJack): Code in Code-Tags gesetzt.
Verfasst: Freitag 25. Januar 2008, 18:32
von Nikolas
Du solltest die
-Tags benutzen.
Wo liegt denn eigentlich das Problem?
Verfasst: Freitag 25. Januar 2008, 18:33
von Imperator
Ihr habt doch bestimmt was dazu aufgeschrieben im heft. Also schau doch einfach nach.

Verfasst: Freitag 25. Januar 2008, 18:44
von söan
Ne das ist ja gerade das Problem, wir haben dazu noch nichts aufgeschrieben

Verfasst: Freitag 25. Januar 2008, 18:45
von EyDu
Schaffst du es nicht mal Fibonacci und Rekursion bei Google einzugeben? Da hast du gleich tausend fertige Lösungen.
Verfasst: Freitag 25. Januar 2008, 19:01
von Nikolas
Das Programm funktioniert doch. Was ist denn eigentlich die Frage?
Verfasst: Freitag 25. Januar 2008, 19:03
von Craven
Nikolas hat geschrieben:Das Programm funktioniert doch. Was ist denn eigentlich die Frage?
Wie man das Programm mit Rekursion gestalten könnte.
Verfasst: Freitag 25. Januar 2008, 19:34
von Imperator
Verfasst: Freitag 25. Januar 2008, 19:37
von DarXun
EyDu hat geschrieben:Schaffst du es nicht mal Fibonacci und Rekursion bei Google einzugeben? Da hast du gleich tausend fertige Lösungen.
Das ist doch nicht der Sinn der Sache bei einer Hausaufgabe...
Er möchte doch Hilfestellungen und keine ganzen Lösungen...
@Topic:
Du setzt zu Anfang der Funktion a und b jedes Mal auf 0.
Bei einer Rekursiven Lösung solltest du bei jedem Funktionsaufruf vllt. die neuen Werte von a und b übergeben, und sie nicht immer wieder auf 0 setzen
Wenn du noch Fragen hast, ... ... dann frag

Verfasst: Freitag 25. Januar 2008, 19:43
von BlackJack
@Nikolas: Nachdem ich das Programm in Code-Tags gesetzt habe, sieht's nicht mehr so aus als wenn's funktioniert.
@söan: Wenn Du Rekursion von Logo kennst, dann sehe ich jetzt das Problem bei Python nicht. Das Konzept "Rekursion" ist sprachunabhängig. ``OUTPUT`` von Logo heisst in Python ``return``. Arbeite das Python-Tutorial aus der Dokumentation durch bis Du alles über Funktionen weisst, und dann übertrage das Wissen von Logo einfach auf Python.
Verfasst: Freitag 25. Januar 2008, 19:45
von EyDu
DarXun hat geschrieben:Das ist doch nicht der Sinn der Sache bei einer Hausaufgabe...
Er möchte doch Hilfestellungen und keine ganzen Lösungen...
Für mich hört sich der Post aber ganz anders an: "Hier habt hier meinen Code, ich brauche eine rekursive Lösung, wenn ihr Fragen zur Aufgabe habt könnt ihr mich fragen, sonst stellt einfach das Ergebnis online."
Und sich das bißchen selbst zu erarbeiten ist wirklich keine Schwierigkeit.
Verfasst: Freitag 25. Januar 2008, 20:38
von Nikolas
@ BlackJack: Das es nicht funktioniert könnte auch daran liegen, dass du das print b eine Einrücktung zu weit links gesetzt hast.

Verfasst: Freitag 25. Januar 2008, 20:55
von BlackJack
@Nikolas: Nein das habe ich nicht getan, das war schon so. Ich habe nur die Code-Tags gesetzt.
Verfasst: Freitag 25. Januar 2008, 23:01
von DarXun
Also ich will nochmal einen kleine Tipp geben.
Ich hab diese Aufgabe so gelöst:
1.) Deine Funktion kopiert
2.) Überlegungen: Rekursive Funktionen rufen sich selber auf und haben eine Abbruchbedingung, d.h. die Variablen a und b dürfen nicht bei jedem Aufruf neu auf 1 gesetzt werden ( wie oben bereits gesagt)
3.) Die Schleife muss ersetzt werden
4.) Abbruchbedingung: falls n 50 ist ( n ist die Zählervariable)
So... Die Tipps sollten eigentlich reichen <.<
Ist ja schon fast die Lösung...

Verfasst: Freitag 25. Januar 2008, 23:16
von BlackJack
Wobei man vielleicht auch einfach durch die Definition der Fibonacci-Zahlen zu einer Rekursiven Lösung kommt. So wie die normalerweise mathematisch definiert werden, hat man die Lösung ja im Grunde schon auf dem Silbertablett serviert.
Ist dann zwar nicht endrekursiv, aber effizient ist eine rekursive Lösung in Python ja sowieso nicht, wenn man als Alternative etwas einfaches, iteratives machen kann.
Verfasst: Samstag 26. Januar 2008, 11:10
von Leonidas
BlackJack hat geschrieben:Ist dann zwar nicht endrekursiv, aber effizient ist eine rekursive Lösung in Python ja sowieso nicht, wenn man als Alternative etwas einfaches, iteratives machen kann.
Ich warte nur noch auf eine Python-Implementation die Endrekursiv ist

Habe letztens zum Spaß mal ``map()`` rekursiv implementiert, nachdem ich das in ML gesehen habe
Rekursion kann im Kopfweh tun, aber Fibonacci ist auf jeden Fall recht simpel hinzubekommen. Vermutlich sogar einfacher als iterativ.
Verfasst: Samstag 26. Januar 2008, 12:31
von sma
Leonidas hat geschrieben:Ich warte nur noch auf eine Python-Implementation die Endrekursiv ist :)
Müsste Stackless das nicht sein? Ansonsten biete ich dir
meinen Python-Interpreter als Grundlage an ;)
Ich merke mir dort keine Funktionsobjekte im Frame, aber unter der Annahme, dass es reicht, die Identität von Code-Objekten zu vergleichen, müsste folgendes in `CALL_FUNCTION` ausreichen, um das Erzeugen neuer Frame-Objekte (und damit den rekursiven Abstieg) zu unterdrücken:
Code: Alles auswählen
if func.func_code is self.f_code:
self.f_locals = f_locals(func, args)
self.f_lasti = 0
self.f_stack = []
return self
return Frame(self, func.func_code, f_locals(func, args)) # todo add kw
Stefan
Verfasst: Samstag 26. Januar 2008, 12:52
von BlackJack
@Leonidas: Du meinst wohl eine Python-Implementierung die Endrekursion erkennt und "tail call optimization" betreibt, also die Rekursion in eine Schleife umwandelt. Dann bleiben immer noch Funktionen die nicht endrekursiv sind und die man auch nicht so einfach in diese Form bringen kann.
Verfasst: Samstag 26. Januar 2008, 13:00
von Leonidas
BlackJack hat geschrieben:@Leonidas: Du meinst wohl eine Python-Implementierung die Endrekursion erkennt und "tail call optimization" betreibt, also die Rekursion in eine Schleife umwandelt.
Ja, habe das etwas schlampig ausgedrückt.