我需要在方案中获得列表的最大值和最小值。 (我们不允许使用内置函数。)下面的代码有问题。我不确定是什么,也许是括号。有人可以帮忙吗?
#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)
答案 0 :(得分:1)
这里的主要问题是最后一行:
else (temp))))))
这里的括号不正确 - else
关键字需要在parens中。将其更改为:
(else temp))))))
...修复算法。
你也没有正确地调用maxmin
- 它需要一个列表,而不是一系列参数。你的最后一行计划如下:
(maxmin '(1 2 3))
这些更改将使您的程序正常运行。
但是,你的代码并不是非常惯用的Racket。它与Scheme类似,虽然Racket是Scheme派生词,但它是一种单独的语言,有自己的习语。
如果您想编写惯用的球拍代码,可以使用方括号代替不同位置的括号,以提高可读性。此外,您可以使用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))