Scheme 中的最大值和最小值

Max and min in Scheme

我需要获取方案中列表的最大值和最小值。 (我们不允许使用内置函数。)下面的代码有问题。我不确定是什么,也许带有括号。有人可以帮忙吗?

#lang racket

(define (maxmin L)
  (cond 
    ((null? L) '()) 
    ((null? (cdr L)) (list (car L) (car L))) 
    (else (let((mmtemp(maxmin (cdr L)))
               (first (car L)))
            (cond(( > first (car mmtemp))
                  (cons first(cdr mmtemp)))
                 (( < first (car mmtemp))
                  (list (car mmtemp) first))
                 else (temp))))))     

( maxmin 1 2 3)

这里的主要问题是最后一行:

else (temp))))))

这里的括号不正确——else 关键字需要在括号内。将其更改为:

(else temp))))))

...修复算法。

您也没有正确调用 maxmin——它需要一个列表,而不是一系列参数。该程序的最后一行应如下所示:

(maxmin '(1 2 3))

这些更改将使您的程序正常工作。


但是,您的代码不是很地道的 Racket。它非常像 Scheme,虽然 Racket 是 Scheme 的衍生产品,但它是一种具有自己的成语集的独立语言。

如果您想编写惯用的 Racket 代码,可以在各个地方使用方括号代替圆括号以提高可读性。此外,您可以使用 first 代替 carrest 代替 cdr 来对列表进行操作,使事情更清楚。

合并这些更改会导致代码(在我看来)更具可读性。

#lang racket

(define (max-min lst)
  (cond 
    [(null? lst) '()]
    [(null? (rest lst))
     (list (first lst) (first lst))]
    [else
     (let ([rst (max-min (rest lst))]
           [fst (first lst)])
       (cond
         [(> fst (first rst))
          (cons fst (rest rst))]
         [(< fst (first rst))
          (list (first rst) fst)]
         [else rst]))]))

(max-min '(1 2 3))