我是个初学者。我有这样的功能:
(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)]
)
Run Code Online (Sandbox Code Playgroud)
在此函数中,我多次计算 (sqrt (+ (* AA) (* BB)))。我只想在这个函数的开头计算这个表达式一次(使常量或变量),但我不知道如何......
您有几个选择,对于初学者,您可以使用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)]))
Run Code Online (Sandbox Code Playgroud)
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)])))
Run Code Online (Sandbox Code Playgroud)
或者使用一种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)])))
Run Code Online (Sandbox Code Playgroud)
无论如何,请注意为变量选择一个好的名称(distance在本例中)并在表达式的其余部分引用该名称是多么重要。另外,值得指出的是,所使用的语言(初级、高级等)可能会限制可用的选项。