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

Function in Scheme that shows the minimum and the maximum numbers (integers) in a list

有没有办法在 Scheme 中创建一个函数来接收数字(整数)列表,然后创建一个包含该列表的最大和最小数字的列表?

我知道如何为每个最大值创建一个函数,

(define (mini a)
 (if (null? (cdr a)) (car a) 
  (min (car a) (mini(cdr a))) 
 )
)

和最小值:

(define (maxi a)
 (if (null? (cdr a)) (car a) 
  (min (car a) (maxi(cdr a))) 
 )
)

我想要的是以最简单的方式完成这两项工作的一个功能,因为我对这种范式还很陌生。

好吧,你已经很接近了。只需使用您已有的功能即可。

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

您制作了一个包含列表和两个变量的助手,一个用于最大值,一个用于最小值。您以 maxmin 作为第一个元素的值开始,然后使用过程 maxmin 将其余元素迭代到具有当前元素的新元素max/min。当您到达列表末尾时,您 return 将保存最小值和最大值的变量。

所以它看起来像这样:

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