2012-03-27 11 views
0

In Konkrete Abstraktionen gibt es dieses Beispiel für Rekursion:Scheme/einfache Rekursion Fragen

(define subtract-the-first (lambda (n) 
          (if (= n 0) 0 
           (- (subtract-the-first (- n 1)) n)))) 

Das verstehe ich. Wenn z. B. n = 3 ist, ergibt diese Funktion: (- (+ (+ (+ 1) 2) 3)) -> -6

In einem der folgenden Beispiele soll jedoch erklärt werden, warum die Reihenfolge der Operationen nicht geändert werden kann. Zum Beispiel, lassen Sie uns dies betrachten:

(define subtract-the-first2 (lambda (n) 
          (if (= n 0) 0 
           (- n (subtract-the-first2 (- n 1)))))) 

Wenn ich (subtrahieren-the-first2 4) nennen, ist das Ergebnis 2. Allerdings verstehe ich nicht ganz die Auswertung. Offensichtlich mache ich hier einen Fehler, denn siehe hierzu: (- 4 (+ 3 (+ 2 (+ 1)))), was (- 4 6) entspricht und somit zu -2 auswertet.

schätze ich irgendwelche Hinweise, wie ich für eine halbe Stunde Kopf gegen die Wand oder so schon ...

Danke hämmern mir habe!

Antwort

2

Sie können die Auswertung dieser Funktion überprüfen, indem Sie einige semiquote s und unquote s Zugabe:

(define subtract-the-first2 (lambda (n) 
           (if (= n 0) 0 
           `(- ,n ,(subtract-the-first2 (- n 1)))))) 

Dann bewerten:

> (subtract-the-first2 4) 
(- 4 (- 3 (- 2 (- 1 0)))) 

Dies wertet zu 2. (Ich sehe nicht, wo Sie die Pluspunkte haben ...)

+0

Vielen Dank! Ich habe falsche Annahmen über die Bewertung gemacht, aber jetzt ist alles klar. – talkinghead