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)
您制作了一个包含列表和两个变量的助手,一个用于最大值,一个用于最小值。您以 max
和 min
作为第一个元素的值开始,然后使用过程 max
和 min
将其余元素迭代到具有当前元素的新元素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))))))
有没有办法在 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)
您制作了一个包含列表和两个变量的助手,一个用于最大值,一个用于最小值。您以 max
和 min
作为第一个元素的值开始,然后使用过程 max
和 min
将其余元素迭代到具有当前元素的新元素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))))))