Scheme中的函数,显示列表中的最小和最大数字(整数)

时间:2016-04-03 00:58:26

标签: scheme

有没有办法在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))) 
 )
)

我想要的是以最简单的方式做到这两点的一个功能,因为我对这个范例很陌生。

2 个答案:

答案 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作为第一个元素的值,然后使用过程maxmin对当前元素的新元素进行迭代。最大/最小值。当您点击列表的末尾时,您将返回将包含最小值和最大值的变量。

所以看起来会像这样:

(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))))))