球拍方案在功能上定义常量

时间:2013-04-20 13:03:19

标签: scheme racket

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

(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(+(* A A)(* B B)))。我想在这个函数的开头只计算一次这个表达式(make constant或variable)但是我不知道怎么...

2 个答案:

答案 0 :(得分: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),并在表达式的其余部分引用该名称。此外,值得指出的是,正在使用的语言(初级,高级等)可能会限制哪些选项可用。

答案 1 :(得分:1)

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