2009-11-08 6 views
5

Je travaille seul sur SICP, donc je n'ai pas d'instructeur à poser à ce sujet. Ce code est supposé approcher pi mais renvoie toujours zéro à la place.SICP 1.31: Approximativement 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)))) 

Voici les procédures de mod et de produit référencées dans ce code. Ceux-ci ne semblent pas être le problème mais je les inclurai juste 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 de plutôt stupide, mais je suis nouveau sur Scheme et je ne le trouve pas. Si quelqu'un a des conseils stylistiques, j'apprécierais vraiment cela aussi. Merci!

Répondre

3

Votre fonction produit a un défaut subtil:

(product + 4 5) 

retourne 120 lorsque la réponse est 20. La raison est

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

Ah, c'était exactement le problème. J'aurais dû savoir que c'est un mauvais signe quand je n'utilise pas tous mes paramètres formels. Maintenant tout fonctionne, merci! – gregsabo

0

Dans l'appel à product-iter dans la fonction product, il fera (* 1 (factor 1)) droit dans la première itération, qui évaluera à 0 car (factor 1) est 0. Par conséquent, le produit total sera de 0 aussi bien.

+0

Vous êtes droite je vraiment juste oublié de mettre en œuvre la plage de démarrage inférieure dans la fonction du produit. – gregsabo

Questions connexes