Scheme中的最大值和最小值

时间:2015-02-27 02:05:36

标签: scheme max racket min

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

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

1 个答案:

答案 0 :(得分:1)

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

else (temp))))))

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

(else temp))))))

...修复算法。

你也没有正确地调用maxmin - 它需要一个列表,而不是一系列参数。你的最后一行计划如下:

(maxmin '(1 2 3))

这些更改将使您的程序正常运行。


但是,你的代码并不是非常惯用的Racket。它与Scheme类似,虽然Racket是Scheme派生词,但它是一种单独的语言,有自己的习语。

如果您想编写惯用的球拍代码,可以使用方括号代替不同位置的括号,以提高可读性。此外,您可以使用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))