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
War es hilfreich?

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top