方案让形式

时间:2015-04-13 17:06:08

标签: scheme let

我有以下任务。

  

在此实现中,您必须使用let-form来定义本地名称和   PI,areac和volumec的本地过程。程序   TotalVolume和main仍然是全球性的。

我有问题3中创建的程序:

(define PI 3.14159265)
(define (areac d)
  (* (* PI (/ d 2)) (/ d 2)))
(define (volumec d h)
  (let ((a (areac d)))
    (/ (* a h) 3)))
(define (TotalVolume)
  (let ((v1 (volumec 1 1))
        (v2 (volumec 2 2))
        (v3 (volumec 3 3))
        (v4 (volumec 4 4))
        (v5 (volumec 5 5)))
    (display (+ v1 v2 v3 v4 v5))))
(define main  
  (TotalVolume))

但现在我对如何使用let-form更改代码感到困惑。我理解let-form是如何工作的,我理解对于PI我可以使用:

(let
    (
     (PI 3.14159265)
)
(body)
)

任何人都可以指导我解决这个问题的正确方向吗?

1 个答案:

答案 0 :(得分:0)

这里的关键点是某些定义取决于之前的定义(例如:volumec需要areacPI),因此我们需要嵌套绑定并定义函数使用lambda s。方法如下:

(define (TotalVolume)
  (let ((PI 3.14159265))
    (let ((areac (lambda (d) (* (* PI (/ d 2)) (/ d 2)))))
      (let ((volumec (lambda (d h) (/ (* (areac d) h) 3))))
        (let ((v1 (volumec 1 1))
              (v2 (volumec 2 2))
              (v3 (volumec 3 3))
              (v4 (volumec 4 4))
              (v5 (volumec 5 5)))
          (display (+ v1 v2 v3 v4 v5)))))))

更简单的方法是使用let*,它允许我们定义依赖于先前定义的变量的绑定:

(define (TotalVolume)
  (let* ((PI 3.14159265)
         (areac (lambda (d) (* (* PI (/ d 2)) (/ d 2))))
         (volumec (lambda (d h) (/ (* (areac d) h) 3)))
         (v1 (volumec 1 1))
         (v2 (volumec 2 2))
         (v3 (volumec 3 3))
         (v4 (volumec 4 4))
         (v5 (volumec 5 5)))
    (display (+ v1 v2 v3 v4 v5))))