2

我是计划的初学者。我有这样的功能:

(define (getRightTriangle A B N) (
                            cond
                              [(and (integer? (sqrt (+ (* A A) (* B B)))) (<= (sqrt (+ (* A A) (* B B))) N))
                               (list (sqrt (+ (* A A) (* B B))) A B)
                               ]
                              [else (list)]

                            )

在这个函数中,我计算了 (sqrt (+ (* AA) (* BB))) 几次。我只想在这个函数的开头计算这个表达式一次(使常量或变量),但我不知道如何......

4

2 回答 2

3

你有几个选择,对于初学者,你可以使用这样的define特殊形式:

(define (getRightTriangle A B N)
  (define distance (sqrt (+ (* A A) (* B B))))
  (cond [(and (integer? distance) (<= distance N))
         (list distance A B)]
        [else (list)]))

或者local,如果使用一种高级教学语言,请使用:

(define (getRightTriangle A B N)
  (local [(define distance (sqrt (+ (* A A) (* B B))))]
    (cond [(and (integer? distance) (<= distance N))
           (list distance A B)]
          [else (list)])))

或者使用一种let特殊形式来创建局部变量,恕我直言,这是最干净的方式:

(define (getRightTriangle A B N)
  (let ((distance (sqrt (+ (* A A) (* B B)))))
    (cond [(and (integer? distance) (<= distance N))
           (list distance A B)]
          [else (list)])))

无论如何,请注意为变量选择一个好的名称(distance在这种情况下)是多么重要,并在表达式的其余部分引用该名称。此外,值得指出的是,使用的语言(初级、高级等)可能会限制可用的选项。

于 2013-04-20T13:34:46.173 回答
1

看一下let表单(及其相关的表单let *、letrecletrec *)。好的描述是http://www.scheme.com/tspl4/start.html#./start:h4http://www.scheme.com/tspl4/binding.html#./binding:h4

于 2013-04-20T13:15:00.050 回答