我是初学者计划。我有这样的功能:
(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)但是我不知道怎么...
答案 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:h4和http://www.scheme.com/tspl4/binding.html#./binding:h4。