2017-10-01 2 views
1

Ich lese Sicp, gibt es ein Problem (Praxis 1.29), schreibe ich eine Schema-Funktion, um die Frage zu lösen, aber es scheint, dass der rekursive Aufruf der Funktion die falsche Antwort bekommen. Wirklich seltsam für mich. Der Code lautet wie folgt:Rekursive Aufruf in Scheme Sprache

(define simpson 
    (lambda (f a b n) 
    (let ((h (/ (- b a) n)) 
      (k 0)) 
     (letrec 
      ((sum (lambda (term start next end) 
        (if (> start end) 
         0 
         (+ (term start) 
         (sum term (next start) next end))))) 
      (next (lambda (x) 
        (let() 
        (set! k (+ k 1)) 
        (+ x h)))) 
      (term (lambda (x) 
        (cond 
        ((= k 0) (f a)) 
        ((= k n) (f b)) 
        ((even? k) (* 2 
            (f x))) 
        (else (* 4 
           (f x))))))) 
     (sum term a next b))))) 

Ich habe nicht die richtige Antwort erhalten.

Zum Beispiel, wenn ich versuche, die simpson Funktion wie folgt zu nennen:

(simpson (lambda (x) x) 0 1 4)

ich erwartete, dass die 6 erhalten, aber es ergab 10 zu mir, ich bin nicht sicher, wo der Fehler ist. Es scheint mir, dass die innerhalb der Simpson-Funktion definierte Funktion "sum" nicht richtig ist.

Wenn ich die Sum-Funktion in Simpson mit der Iteration anstelle von rekursiv schreiben, bekomme ich die richtige Antwort.

+0

Mutation und Rekursion ist eine tückische Kombination. Wenn du SICP studierst, solltest du 'let!' Überhaupt nicht verwenden, bis es in Kapitel 3 eingeführt wurde. Das Weiterspringen ist selten eine gute Idee beim Lernen. – molbdnilo

+0

Vielen Dank für Ihre Beratung. Aber ich möchte nur wissen, was mit meiner obigen Funktion passiert ist. Warum es bei meiner Funktion nicht funktioniert. Ich analysiere die Aktion der Summenfunktion Schritt für Schritt, es scheint kein Problem zu sein, kann aber nicht die richtige Antwort bekommen. Seltsam genug ,:( – John

Antwort

0

Sie müssen die Summe mit h/3 multiplizieren:

(* 1/3 h (sum term a next b)) 
+0

Ja, ich weiß, aber Summe sollte 6 nicht 10 zu mir zurück, so dass ich die richtige Antwort bekommen kann. Die Rückkehr der Summe ist falsch. Es ist wirklich seltsam für mich. Ich bin sicher, dass dieser Begriff genannt wurde 4 mal, und es sollte 6 zurück, aber es tat nicht.Auf jeden Fall, danke für Ihre Hilfe. – John

+0

Kennt jemand den Grund? Es muss etwas falsch sein, aber ich kann es nicht finden. Jemand helfen ... – John

+0

Can Sie zeigen die Berechnung Ihres erwarteten Ergebnisses an? – soegaard