Scheme 方案中的最大值和最小值
我需要得到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)))
#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周围放置()。