2009-11-08 10 views
5

Ich arbeite durch SICP auf eigene Faust, so dass ich keinen Lehrer habe, um darüber zu fragen. Dieser Code soll Pi annähern, gibt aber immer null zurück.SICP 1.31: Approximieren Pi

(define (approx-pi acc) 
    (define (factors a) 
    (define basic-num 
     (if (= (mod a 2) 0) 
      (/ a 2) 
      (/ (- a 1) 2))) 
    (if (= (mod basic-num 2) 0) 
     basic-num 
     (/ 1 basic-num))) 
    (* 4 (product factors 5 (* 2 acc)))) 

Hier sind die Mod- und Produktprozeduren, auf die in diesem Code verwiesen wird. Diese scheinen nicht das Problem zu sein, aber ich werde sie für alle Fälle einschließen.

(define (product func lo hi) 
    (define (product-iter i result) 
    (if (> i hi) 
     result 
     (product-iter (+ 1 i) (* result (func i))))) 
    (product-iter 1 1)) 

(define (mod a b) 
    (if (< (- a b) 0) 
    a 
    (mod (- a b) b))) 

Das Ganze ist eine Implementierung der Formel:

pi/4 = (2 * 4 * 4 * 6 ...)/(3 * 3 * 5 * 5 ...)

Mein Fehler ist offensichtlich etwas ziemlich dumm, aber ich bin neu in Scheme, so dass ich es nicht finden kann. Wenn jemand irgendwelche stilistischen Tipps hat, würde ich das auch sehr schätzen. Vielen Dank!

Antwort

3

Ihre Produktfunktion hat einen subtilen Fehler:

(product + 4 5) 

liefert 120, wenn die richtige Antwort ist 20. Der Grund dafür ist

(product-iter 1 1) should be (product-iter lo 1) 
+0

Ah, das war das Problem genau. Ich hätte wissen müssen, dass es ein schlechtes Zeichen ist, wenn ich nicht alle meine formalen Parameter verwende. Jetzt funktioniert alles, danke! – gregsabo

0

In dem Aufruf von product-iter in der Funktion product, wird es (* 1 (factor 1)) rechts in der ersten Iteration tun, die daher auf 0, weil (factor 1) 0. bewerten werden, wird das gesamte Produkt 0 als gut.

+0

Sie sind rechts- ich wirklich vergessen, nur die Umsetzung niedrigerer Startbereich in der Produktfunktion. – gregsabo