4

我想将预定义(max)函数(R5RS)与list长度不同的数字一起使用。不幸的是,(max)接受这样的输入:

(max 2 43 5 6)
=> 43

我正在尝试像这样使用它:

(define lst '(3 5 53 4 53 54 32))
(max lst)

这会产生以下错误。

max: expects argument of type <real number>; given (3 5 53 4 53 54 32)

当我将它们传递给时,如何将此列表分解为我需要的单个参数(max)

4

3 回答 3

6

您可能会考虑使用apply(尽管被警告,这可能会限制元素/参数的数量是可以接受的,这取决于您对 Scheme 的实施):

(apply max '(3 4 2 1 78 2 1))

一般来说,如果不知道元素的数量很少,那么手动执行可能会更安全:

(define max* (list)
    (if (null? list) (negative-infinity)
        (let loop ((list (cdr list)) (best (car list)))
            (if (null? list) best (loop (cdr list) (max best (car list)))))))
于 2011-05-15T21:12:31.247 回答
1

使用 apply 基本上可以转换为运行(max 3 4 2 1 78 2 1),但在某些系统上,过程可以传递的参数数量不是无限的。对于max,您可以通过使用 fold 来利用它的交换性:

(fold-left max -inf.0 '(3 4 2 1 78 2 1))
于 2011-05-20T02:06:46.800 回答
0

您可以编写一个将第一项与第二项进行比较的过程,

(define (largestele lst)
        (if (null? (cdr lst))
            (car lst)
            (if (> (car lst) (cadr lst))
                (largestele (cons (car lst) (cddr lst)))
                (largestele (cdr lst)))))
于 2013-04-28T20:56:39.423 回答