Pregunta

Estoy trabajando a través SICP por mi cuenta, así que no tiene un instructor para preguntar acerca de esto. Este código se supone que debe aproximar pi pero siempre devuelve cero en su lugar.

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

Estos son los procedimientos y productos mod que se hace referencia en este código. Estas no parecen ser el problema, pero voy a incluirlos 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 muy estúpido, pero yo soy nuevo con el Esquema así que no puedo encontrarlo. Si alguien tiene algún consejo estilísticos, yo realmente apreciaría que, también. Gracias!

¿Fue útil?

Solución

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)

Otros consejos

En la llamada a product-iter en el product función, se hará derecho (* 1 (factor 1)) 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top