SICP Übung 1.16, wo ist mein Fehler, weil es mir richtig aussieht
Frage
Ich habe gerade angefangen habe zum Spaß durch dieses Buch arbeiten; Ich wünschte, es wäre Hausaufgaben, aber ich konnte nie MIT teilnehmen leisten, und es gibt jede Menge Leute klüger als ich sowieso. : P
Fast-exp soll b ^ n finden, das heißt 4 ^ 2 = 16, 3 ^ 3 = 27
(define (fast-exp b n)
(define (fast-exp-iter n-prime a)
(cond ((= n-prime 1) a)
((= (remainder n-prime 2) 1) (fast-exp-iter (- n-prime 1) (* a b)))
(else (fast-exp-iter (/ n-prime 2) (* a b b)))))
(fast-exp-iter n 1))
fast-exp 4 2; Expected 16, Actual 2
Lösung
Sie haben vergessen, schnell exp zu nennen. Stattdessen ausgewertet Sie drei separate Atome. Um tatsächlich die schnell exp von 4 zum 2 zu bewerten, müßten Sie schreiben
(fast-exp 4 2)
Andere Tipps
Die Lösung, die Sie hier geschrieben haben, ist auch falsch. z.B. Check out (schnell-exp 2 6). Erwartet: 64, aktuell:. 32
Ihre Lösung ist die Berechnung falsche Antworten. (Siehe http://ideone.com/quT6A ) In der Tat, wie Sie prinzipiell schreiben können ein tail-rekursive schnelle Potenzierung nur zwei Zahlen als Argumente zu übergeben? Ich glaube nicht, ist es sogar möglich ist, weil in der Mitte der Berechnung Sie wissen nicht, was Multiplikator zu verwenden, wenn Sie ungerade Exponenten auftreten. Aber ich kann ein Beispiel der Arbeitslösung geben, die genau das, was von SICP Autoren zu erwarten ist (iterativer Prozess „unveränderliche Menge“ (a * b ^ n) verwendet wird, wobei a anfänglich 1)
(define (pow x y)
(define (powi acc x y)
(cond
((= y 0) acc)
((odd? y) (powi (* acc x) x (- y 1)))
(else (powi acc (* x x) (/ y 2)))))
(powi 1 x y))