2009-11-08 8 views
5

Estoy trabajando con el SICP solo, por lo que no tengo un instructor que me pregunte sobre esto. Se supone que este código se aproxima a pi, pero siempre devuelve cero en su lugar.SICP 1.31: Aprox. 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)))) 

A continuación, se detallan los procedimientos de mod y producto a los que se hace referencia en este código. Estos no parecen ser el problema, pero los incluiré por si acaso.

(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))) 

Todo esto es una implementación de la fórmula:

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

Mi error es, obviamente, algo bastante estúpido, pero soy nuevo en Scheme, así que no puedo encontrarlo. Si alguien tiene algún consejo estilístico, realmente lo apreciaría también. ¡Gracias!

Respuesta

3

La función de su producto tiene un defecto sutil:

(product + 4 5) 

devuelve 120 cuando la respuesta correcta es 20. La razón es

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

Ah, ese era el problema exactamente. Debería haber sabido que es una mala señal cuando no uso todos mis parámetros formales. Ahora todo funciona, gracias! – gregsabo

0

En la llamada a la función product-iter en product, lo hará (* 1 (factor 1)) la derecha en la primera iteración, que evaluará a 0 porque (factor 1) es 0. Por lo tanto, el producto total será de 0 también.

+0

Eres derecha Realmente olvidé de poner en práctica el menor rango de inicio en la función del producto. – gregsabo