我需要在Scheme中为类编写一个函数,以查找列表中的最小值和最大值。我们不允许使用内置的min和max函数。我发现了一段代码,可以找到最大值和最小值,但对我来说,它输出最小值作为列表的头部。这是代码:
(define (minmax lst)
(cond
((null? lst) '())
((null? (cdr lst)) (list (car lst) (car lst)))
(else
(let ((mmtemp (minmax (cdr lst))) (first (car lst)))
(cond
((> first (car mmtemp)) (cons first (cdr mmtemp)))
((< first (car mmtemp)) (list (car mmtemp) first))
(else mmtemp))))))
如果我输入:
(minmax '(3 4 6 9 22 203 1 43 8 4))
我明白了:
(203 3)
当我真正需要时:
(1 203)
我没有Scheme的经验,演讲幻灯片没有帮助。需要更改什么来翻转输出顺序并获得正确的最小值?
答案 0 :(得分:0)
阅读else
子句中的代码mmtemp
这是一个列表car
是最大的,cadr
是最小的。然后,将当前元素与仅最大进行比较,以确定是要替换最大还是最小。因此,你的逻辑在那里是错误的。
要切换最小和最大的位置,只需切换要替换的元素即可。
以下是我的所作所为:
(define (minmax lst)
(define (helper lst min max)
(if (null? lst)
(list min max) ; result is in min and max arguments
(let ((cur (car lst)) (rest (cdr lst)))
(cond ((<= min cur max) (helper rest min max)) ; correct order
((> cur max) (helper <??> <??> <??>))
(else (helper <??> <??> <??>))))))
(if (null? lst)
#f ; or perhaps signal an error?
(helper (cdr lst) (car lst) (car lst))))
(minmax '()) ; ==> #f
(minmax '(5)) ; ==> (5 5)
(minmax '(4 2 5 1)) ; ==> (1 5)