正如@WorBlux 指出的那样,您有一些括号问题。除此之外,我有几个提示:
- 如果使用嵌套
if
的s来分隔条件会更清楚一些
- 您的条件不正确,缺少相等的情况
- 如果条件合适,就不需要一个包罗万象的
else
案例
- 您应该声明一个帮助程序来执行实际的平方和
这就是我的意思:
(define (sumsq x y)
(+ (* x x) (* y y)))
(define (toptwosq a b c)
(if (>= a b)
(if (>= b c)
(sumsq a b)
(sumsq a c))
(if (>= a c)
(sumsq b a)
(sumsq b c))))
相同的代码可以使用 编写如下cond
,注意如何正确表达条件以覆盖所有情况:
(define (toptwosq a b c)
(cond ((and (>= a b) (>= b c)) (sumsq a b))
((and (>= a b) (< b c)) (sumsq a c))
((and (< a b) (>= a c)) (sumsq b a))
((and (< a b) (< a c)) (sumsq b c))))
最后一个条件可以替换为else
. 这不是“包罗万象”,我们确信在这一点上没有更多的案例需要考虑:
(define (toptwosq a b c)
(cond ((and (>= a b) (>= b c)) (sumsq a b))
((and (>= a b) (< b c)) (sumsq a c))
((and (< a b) (>= a c)) (sumsq b a))
(else (sumsq b c))))
最后,如果我们很聪明,我们可以摆脱一种情况(第一种和第三种情况相同)并进一步简化条件:
(define (toptwosq a b c)
(cond ((or (>= a b c) (and (>= a c) (> b a)))
(sumsq a b))
((and (>= a b) (> c b))
(sumsq a c))
(else (sumsq b c))))