Neunte Hausaufgabe

vaidas
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 4. Feb 2010 17:12

Neunte Hausaufgabe

Beitrag von vaidas »

Die neunte Hausaufgabe ist jetzt im SVN hochgeladen. Der Abgabetermin ist wie üblich der nächste Donnerstag (7.7.).

Grüße,
Vaidas

Michael Z
Erstie
Erstie
Beiträge: 12
Registriert: 18. Apr 2011 13:53

Re: Neunte Hausaufgabe

Beitrag von Michael Z »

Ist das remove-first bei der 3.6 wirklich als remove-last gedacht?
Wenn bei '(2 3 1 3) die erste 3 rausfliegen soll, würde ich '(2 1 3) erwarten als ergebnis, der Testfall sagt aber '(2 3 1).

Die equals-Implementierung hat übrigens einen Tippfehler, der diesen netten Effekt hat:

Code: Alles auswählen

(tobool (equal zero one)) -> false
(tobool (equal one zero)) -> true
Einmal das (sub m n) durch (sub n m) ersetzen sollte das Problem beheben.

vaidas
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 4. Feb 2010 17:12

Re: Neunte Hausaufgabe

Beitrag von vaidas »

Michael Z hat geschrieben:Ist das remove-first bei der 3.6 wirklich als remove-last gedacht?
Wenn bei '(2 3 1 3) die erste 3 rausfliegen soll, würde ich '(2 1 3) erwarten als ergebnis, der Testfall sagt aber '(2 3 1).
Ja, es soll '(2 1 3) sein. Ich habe es falsch eingetippt.
Michael Z hat geschrieben: Die equals-Implementierung hat übrigens einen Tippfehler, der diesen netten Effekt hat:

Code: Alles auswählen

(tobool (equal zero one)) -> false
(tobool (equal one zero)) -> true
Einmal das (sub m n) durch (sub n m) ersetzen sollte das Problem beheben.
Ja, das ist ein Fehler. Ihr könnt die "equals" Implementierung korrigieren.

Danke für die Fehlermeldungen!

Vaidas

Benutzeravatar
Pan
Erstie
Erstie
Beiträge: 20
Registriert: 3. Nov 2008 15:33

Re: Neunte Hausaufgabe

Beitrag von Pan »

Hallo,

ich bekomme irgendwie die Rekursion nicht zum laufen, noch nicht mal für die abgeänderte Fakultätsfunktion aus dem Script:

Code: Alles auswählen

(define fact
  (lambda (n)
    ((make-rec factStep) n)))

(define factStep
  (lambda (g)
    (lambda (n)
      ((isZero? n)
       one
       (prod n (g (pred n)))))))
Das führt zu einer Endlosschleife. :(

Melkom
Mausschubser
Mausschubser
Beiträge: 89
Registriert: 21. Okt 2005 13:58
Wohnort: Frankfurt am Main

Re: Neunte Hausaufgabe

Beitrag von Melkom »

Also, ich denke mal, das liegt an einer eager Ausführung von isZero.

spark
Erstie
Erstie
Beiträge: 14
Registriert: 18. Okt 2006 23:45
Wohnort: Darmstadt
Kontaktdaten:

Re: Neunte Hausaufgabe

Beitrag von spark »

Wenn du (isZero? n) durch (if (equals (isZero? n) yes) .. ..) ersetzt, dürfte es gehen. Das liegt daran, dass die "Argumente" von if (als eingebautes Sprachkonstrukt) lazy evaluiert werden, wärend die Argumente der yes-Funktion eager ausgewertet werden. Die Vorlesungsfolien geben dazu den Tipp (zugegeben etwas durch die Blume...), dass (lambda ...) zu einer Art Lazy-Evaluation führt, weil der Body von lambda-Ausdrücken nicht direkt eager evaluiert wird.

vaidas
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 4. Feb 2010 17:12

Re: Neunte Hausaufgabe

Beitrag von vaidas »

Das haben wir am Freitag besprochen. Man muss die Lazy-Evaluierung explizit mittels Funktionen modelieren, z.B.:

Code: Alles auswählen

(define factStep
  (lambda (g)
    (lambda (n)
      (((isZero? n)
        (lambda (x) one) 
        (lambda (x) (prod n (g (pred n)))))
       zero))))

Benutzeravatar
blackcomb
Mausschubser
Mausschubser
Beiträge: 70
Registriert: 1. Okt 2007 15:48
Wohnort: Darmstadt

Re: Neunte Hausaufgabe

Beitrag von blackcomb »

spark hat geschrieben:Wenn du (isZero? n) durch (if (equals (isZero? n) yes) .. ..) ersetzt, dürfte es gehen.
Das dürfte aber im Rahmen der Aufgabenstellung nicht erlaubt sein, da das Scheme-"if" nicht zum Lambda-Kalkül gehört.
So wie von Vaidas vorgeschlagen funktioniert es jedenfalls auch.

Benutzeravatar
itportal2
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 236
Registriert: 25. Jan 2008 15:34
Wohnort: Darmstadt

Re: Neunte Hausaufgabe

Beitrag von itportal2 »

Ich habe eine Frage bzgl. Aufgabe 2 - falls nach einem Aufruf von (throw) oder (retry) weitere Statements vorkommen, sollen diese dann NICHT ausgeführt werden?
Mein Code würde so eine Ausfürhung zulassen und der Text wird ausgegeben:

Code: Alles auswählen

(retry)
 (display "after retry!\n")

vaidas
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 4. Feb 2010 17:12

Re: Neunte Hausaufgabe

Beitrag von vaidas »

Ja, nach dem Aufruf von "throw" bzw. "retry" sollten keine weitere Befehle vom "try" bzw. "catch" Block ausgeführt werden.

Benutzeravatar
sewe
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 295
Registriert: 16. Jan 2009 14:53
Kontaktdaten:

Re: Neunte Hausaufgabe

Beitrag von sewe »

Die Punkte finden sich jetzt im SVN.

Antworten

Zurück zu „Archiv“