SICP 1.31:逼近Pi

时间:2009-11-08 04:15:26

标签: 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))))

以下是此代码中引用的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)))

整个事情是公式的实现:

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

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

2 个答案:

答案 0 :(得分:3)

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

(product + 4 5)
当正确答案为20时,

返回120。 原因是

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

答案 1 :(得分:0)

在函数product-iter的{​​{1}}调用中,它会执行 product在第一次迭代中正确,因为(* 1 (factor 1))为0,因此评估为0.因此,总产品也将为0.