SICP 1.31:逼近Pi

gre*_*abo 5 lisp scheme sicp

我正在通过自己的SICP工作,所以我没有教练问这个问题.该代码应该近似于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))))
Run Code Online (Sandbox Code Playgroud)

以下是此代码中引用的mod和产品过程.这些似乎不是问题,但我会包括它们以防万一.

(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)))
Run Code Online (Sandbox Code Playgroud)

整个事情是公式的实现:

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

我的错误显然是非常愚蠢的,但我是Scheme的新手,所以我找不到它.如果有人有任何风格提示,我也非常感激.谢谢!

Tim*_*ley 3

你的产品功能有一个微妙的缺陷:

(product + 4 5)
Run Code Online (Sandbox Code Playgroud)

当正确答案是 20 时,返回 120。原因是

(product-iter 1 1) should be (product-iter lo 1)
Run Code Online (Sandbox Code Playgroud)