仅使用本书那一点提出的概念,我会这样做:
(define (square x) (* x x)) (define (sum-of-squares x y) (+ (square x) (square y))) (define (min x y) (if (< x y) x y)) (define (max x y) (if (> x y) x y)) (define (sum-squares-2-biggest x y z) (sum-of-squares (max x y) (max z (min x y))))
big
被称为max
.当它存在时使用标准库功能.
我的方法不同.我只需添加所有三个的正方形,然后减去最小的正方形,而不是大量的测试.
(define (exercise1.3 a b c) (let ((smallest (min a b c)) (square (lambda (x) (* x x)))) (+ (square a) (square b) (square c) (- (square smallest)))))
当然,无论您喜欢这种方法还是一堆if
测试,都取决于您.
使用SRFI 95的替代实现:
(define (exercise1.3 . args) (let ((sorted (sort! args >)) (square (lambda (x) (* x x)))) (+ (square (car sorted)) (square (cadr sorted)))))
如上所述,但作为一个单行(感谢synx @ freenode #scheme); 还需要SRFI 1和SRFI 26:
(define (exercise1.3 . args) (apply + (map! (cut expt <> 2) (take! (sort! args >) 2))))
我用下面的代码,它使用内置的做到了min
,max
和square
程序.它们非常简单,只能使用文本中引入的内容.
(define (sum-of-highest-squares x y z) (+ (square (max x y)) (square (max (min x y) z))))
这样的事情怎么样?
(define (p a b c) (if (> a b) (if (> b c) (+ (square a) (square b)) (+ (square a) (square c))) (if (> a c) (+ (square a) (square b)) (+ (square b) (square c)))))