SICP 1,31: Approximation Pi
Question
Je travaille par SICP moi-même, donc je ne dispose pas d'un instructeur de poser des questions sur ce sujet. Ce code est censé rapprocher pi, mais revient toujours au lieu de zéro.
(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))))
Voici les procédures de mod et de produits référencés dans ce code. Ceux-ci ne semblent pas être le problème, mais je vais les inclure au cas où.
(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)))
L'ensemble est une implémentation de la formule:
pi / 4 = (2 * 4 * 4 * 6 ...) / (3 * 3 * 5 * 5 ...)
Mon erreur est évidemment quelque chose d'assez stupide, mais je suis nouveau schéma, donc je ne peux pas le trouver. Si quelqu'un a des conseils stylistiques, je voudrais vraiment comprendre que, aussi. Merci!
La solution
Votre fonction produit a un défaut subtil:
(product + 4 5)
retourne 120 lorsque la réponse est 20. La raison en est
(product-iter 1 1) should be (product-iter lo 1)
Autres conseils
Dans l'appel à product-iter
dans la fonction product
, il fera
droit (* 1 (factor 1))
dans la première itération, qui sont évalués à 0, car (factor 1)
est 0. Par conséquent, le produit total sera de 0 aussi bien.