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!
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.