Pergunta

Eu estou trabalhando através SICP em meu próprio, então eu não ter um instrutor para perguntar sobre isso. Este código é suposto pi aproximado mas sempre retorna zero em seu 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))))

Aqui estão os procedimentos modernos e produtos que são referenciados neste código. Estes não parece ser o problema, mas eu vou incluí-los apenas no caso.

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

A coisa toda é uma implementação da fórmula:

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

Meu erro é obviamente algo muito estúpido, mas eu sou novo esquema, então não posso encontrá-lo. Se alguém tiver alguma dica de estilo, eu realmente aprecio isso também. Obrigado!

Foi útil?

Solução

A sua função produto tem uma falha sutil:

(product + 4 5)

retorna 120 quando a resposta correta é 20. A razão é

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

Outras dicas

Na chamada para product-iter na product função, ele vai fazer (* 1 (factor 1)) direita na primeira iteração, que vai avaliar a 0 porque (factor 1) é 0. Portanto, o produto total será de 0 também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top