在Scheme中实现最小/最大功能

时间:2017-04-16 21:33:41

标签: list scheme max min

我需要在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的经验,演讲幻灯片没有帮助。需要更改什么来翻转输出顺序并获得正确的最小值?

1 个答案:

答案 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)