有没有办法在Scheme中创建一个接收数字列表(整数)的函数,然后创建一个列表,其中包含该列表的最大和最小数量?
我知道如何为每个最大值创建一个函数,
(define (mini a)
(if (null? (cdr a)) (car a)
(min (car a) (mini(cdr a)))
)
)
和mininum:
(define (maxi a)
(if (null? (cdr a)) (car a)
(min (car a) (maxi(cdr a)))
)
)
我想要的是以最简单的方式做到这两点的一个功能,因为我对这个范例很陌生。
答案 0 :(得分:2)
嗯,你很亲密。只需使用您已有的功能。
(define (maximini a) (list (maxi a) (mini a)))
编写好的方案程序的很大一部分是将功能分解为单独的可重用程序。封装最小和最大行为是一个混合的问题。
如果存在一次遍历的限制
(define (min a b) (if (< a b) a b))
(define (max a b) (if (> a b) a b))
(define (maximini a)
(let loop [(x -inf.0) (y +inf.0) (a a)]
(if (empty? a)
(list x y)
(loop (max (car a) x) (min (car a) y) (cdr a)))))
(maximini '(-4 3 2 1 10 -5))
; => '(10 -5)
答案 1 :(得分:2)
你创建一个包含列表和两个变量的帮助器,一个用于max,一个用于最小值。您首先使用max
并将min
作为第一个元素的值,然后使用过程max
和min
对当前元素的新元素进行迭代。最大/最小值。当您点击列表的末尾时,您将返回将包含最小值和最大值的变量。
所以看起来会像这样:
(define (min-max lst)
(let helper ((lst (cdr lst)) (cur-min (car lst)) (cur-max (car lst)))
(if (null? lst)
(values cur-min cur-max)
(helper (cdr lst)
(min cur-min (car lst))
(max cur-max (car lst))))))