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.
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
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