Klausur 10/98 3 (Kettenbrüche)

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Klausur 10/98 3 (Kettenbrüche)
Hat von euch irgendjemand ne Lösun für die 3a aus der Klausur von 10/98? Ich hab keine Idee, wie ich das rekursiv, also ohne Akkumulatorvariable machen soll.


im prinzip kannst du das ganze als verschachtelte rekursion. ich hab se zwar noch nicht ganz fertig aber die generelle vorgehensweise ist die : du rufst deine funktion am anfang mit der tiefe k als parameter auf, dann bettest du den naechsten aufruf von deiner approximation in die berechnung selbst ein und kontrollierst immer ob k schon 0 erreicht hat (sonst bricht deine funktion niiiiiieeee wieder ab ggg). es schaut dann im wesentlichen so aus (stark vereinfacht, bitte nicht so eingeben!!):
(define (approx z n k)
(if (eq? k 0)
0
(/ (z iz) (+ (n in) (approx z n (- k 1)))))

dann rufst du die funktion wie gesagt mit den funktionen z und n auf wobei du nicht vergessen darfst dass du noch den initialisierungswert fuer beide funktionen da mit reinkriegen musst. genau daran tueftel ich grad.

ich hof du kannst damit irgendwas anfangen?


ah ja! du schachtelst also praktisch noch in die auessere conf-frac-funktion eine innere approx-funktion. ich hatte naemlich gerade schon ueberlegt, wie das sonst gehen soll, weil du irgendwie den ursprungswert von k speichern musst. wenn ich soweit bin, kommt meine loesung auch droh


sollte eigentlich eine funktion ergeben … ich war nur grade zu faul nachzuschauen wie die die funktion genannt haben …
unter umstaenden kannst du ja wenn du sicher sein willst dass dein k gespeichert wird einfach mit set! bei jedem weiteren aufruf k den wert von (- k 1) zuweisen. geht ja auch


das glaub ich aber nicht. zeig mal ein beispiel.

ich bin jetzt fertig mit meiner version. sie hat jetzt also eine helper-funktion, die allerdings einen linear rekursiven prozess erzeugt. duerfte also ok sein, oder? zum ausprobieren hab ich noch die naechste aufgabe zugepackt, wo man die funktion braucht:

(define conf-frac
  (lambda (z n k)
    (define (helper i)
      (if (> i k)
          0
          (/ (z i) (+ (n i) (helper (+ i 1))))))
    (helper 1)))

(define estimate-pi
  (lambda (k)
    (/ 4
       (+ 1
          (conf-frac
           (lambda (x) (* (- (* 2 x) 1) (- (* 2 x) 1)))
           (lambda (x) 2)
           k)))))

(exact->inexact (estimate-pi 100))

ich hab raus gefunden dass du auch ohne set einfach in jeder verschatelten rekursion den wert praktisch wie einen akkumulator weiterverben kannst da du bei jedem neu aufruf ja nicht die alte umgebung verlaesst sondern eine unterumgebung aufmachst in die dann dein ‘akkumulator’ k reinvererbt wird. es geht also dann anscheinend auch ohne die iterative hilfe, muss es auch da inder aufgabe das rekursiv so fett unterstrichen ist… ggg

ich muss hier etwas korrigieren: ohne es zu wissen hast du es schon verschachtelt rekursiv geloesst. dein naechster aufruf ist eingebettet in die funktion selbst. Das was da an eine iteration erinnert, ist in wirklichkeit nur die initialisierung die deinen vorgang in bewegung setzt.


ja genau. es ist ja im prinzip ein rekursiver prozess, der innerhalb einer anderen prozedur erzeugt wird. das heisst dann verschachtelt rekursiv? naja, mir eigentlich egal, wie es heisst, hauptsache es funktioniert :).