Scheme 方案中的最大值和最小值

Scheme 方案中的最大值和最小值,scheme,max,racket,min,Scheme,Max,Racket,Min,我需要得到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)))

我需要得到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)
#朗球拍
(定义(最大最小值L)
(续)
((null?L)“”())
((空?(cdr L))(列表(左车)(左车)))
(其他(let((mmtemp(maxmin(cdr L)))
(第一辆(L车)))
(条件((>第一个(车辆温度))
(cons优先(cdr mmtemp)))
((<第一辆车(最低温度))
(列表(车辆mmtemp)第一个)
其他(临时(()())))
(最大值1 2 3)

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

else (temp))))))
括号不正确,
else
关键字需要在括号内。将其更改为:

(else temp))))))
…修复了算法

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

(maxmin '(1 2 3))
这些更改将使您的程序正常工作


然而,您的代码不是很地道。它非常类似于Scheme,虽然Racket是Scheme的派生,但它是一种独立的语言,有自己的一套习惯用法

如果您想编写惯用的Racket代码,可以在不同的位置使用方括号代替括号,以帮助提高可读性。此外,您可以使用
first
而不是
car
rest
而不是
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))
#朗球拍
(定义(最大最小lst)
(续)
[(null?lst)'()]
[(空?(rest lst))
(列表(第一个lst)(第一个lst))]
[其他
(让([rst(最大最小值(剩余lst))]
[fst(第一个lst)])
(续)
[(>fst(第一rst))
(cons fst(剩余rst))]
[(
我认为使用它是不可能的;pright我们不能使用scheme有“有问题”的max和min函数你的意思是你得到了一个编译错误吗?或者代码会产生意外的结果?还是有错误
else(temp)
看起来有点不对劲。它不应该是
(cond…(else(temp))
?或
(条件…(其他温度))
?(我不确定temp应该是要调用的函数,还是要返回其值的变量。)但您也使用
(define(maxmin L)…
定义一个函数,该函数将使用一个参数,并且在
(maxmin 1 2 3)
中使用三个参数调用它。如果你想用多个参数调用它,你需要做
(define(maxmin.L)…)
。谢谢你,Joshua,你帮我找出了我粗心的错误。首先,temp被假定为mmtemp-我不小心使用了错误的变量,并且不得不在else周围放置()。