Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Theorie: Rekursive Funktion Abbrechen und Fortsetzen

  Alt 23. Okt 2005, 14:28
Nein, endrekursion ist, hm moment *malWeitAusholt*

Also wenn du etwas rekursiv berechnest, was genau auf einem weiterem (rekursivem) Funktionsaufruf basiert (z.B. Fakultät), dann kannst du diesen Aufruf häufig auch endrekursiv gestallten. Das heißt, du merkst dir in einem Wert, den man Akkumulator nennt, einfach dein Zwischenergebnis. Für die Fakultät kannst du also anfangen und merkst dir in einer Variablen, die Fakultät n (für die ersten n Schritte) und im Schritt (n+1) multiplizierst du n mit (n+1) und speicherst das als dein neues n. Dann musst du natürlich noch wissen wieviele Schritte du schon gemacht hast. Sagen wir du willst die Fakultät von k berechnen, dann hast du ja irgendwann k Schritte gemacht. Endrekursiv heißt dann, dass du einfach fertig bist. In dem n dass du nach k Schritten hast, steht ja deine Lösung. Du brauchst also nicht zurückzuspringen in den vorherigen Aufruf (CODE folgt).
Bei nicht endrekursivem vorgehen rechnest du halt so, dass Fakultät (n = n * Fakultät n-1) ist d.h. wenn du Fakultät n-1 kennst, musst du den Wert noch mal benutzen und mit n berechnen. Du knallst dir also schnell den Stack voll mit Aufrufen, die auf ein Ergebnis warten müssen.

Bei einem Brute-Force iterierst du ja eigentlich über eine gewisse Menge. Da wüßte ich jetzt ehrlich gesagt nicht warum es rekursiv laufen müsste (i.d.R. schlechter als iterativ). Du kannst es wahrscheinlich leicht in eine Iteration umwandeln und dir dann einfach merken, wo du zuletzt warst. So dass du deine Untere und Obere Grenze als Parameter übergibst und dann kannst du beim pausieren einfach diese beiden Grenzen speichern. Der restliche Code könnte dann konstant sein, für alle variablen Teile gilt hingegen, dass man sie als Parameter übergibt und dann halt abspeichern und laden können sollte (was dann sicher kein Prob ist?)
  Mit Zitat antworten Zitat