2009-11-08 8 views
5

Sam pracuję nad SICP, więc nie mam instruktora, który mógłby o to zapytać. Ten kod ma przybliżoną wartość pi, ale zawsze zwraca zero.SICP 1.31: Approximating 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)))) 

Oto procedury dotyczące modów i produktów, do których odnosi się ten kod. To nie wydaje się być problemem, ale uwzględnię je na wszelki wypadek.

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

Całość jest realizacja wzorze

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

Mój błąd jest oczywiście czymś dość głupim, ale jestem nowy w Scheme, więc nie mogę go znaleźć. Jeśli ktoś ma jakieś wskazówki stylistyczne, naprawdę to doceniam. Dzięki!

Odpowiedz

3

Twoja funkcja produkt ma subtelną wadę:

(product + 4 5) 

zwraca 120, gdy odpowiedź jest poprawna 20. Powodem jest

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

Ach, to był problem. Powinienem był wiedzieć, że to zły znak, kiedy nie używam wszystkich moich formalnych parametrów. Teraz wszystko działa, dzięki! – gregsabo

0

w wywołaniu product-iter w funkcji product, to zrobi (* 1 (factor 1)) prawo w pierwszej iteracji, który zostanie skonwertowany do 0 bo (factor 1) 0. Zatem całkowity produkt będzie 0, jak również.

+0

Jesteś prawy- naprawdę tylko zapomniał wdrożenia niższy zakres początkowy w funkcji produktu. – gregsabo