计算可变数量参数的最大值

时间:2013-04-14 01:55:24

标签: clojure

我是Clojure的新手,所以我想知道是否有人可以向我解释我哪里出错了。我正在解决4Clojure中的一些问题以使其熟悉,其中一个是计算可变数量参数的最大值,而不使用Clojure的内置最大函数。我应该填补空白:

(_ 1 8 3 4)

结果是4。

为此,我试图实现变量arity的功能。因为Lisp中的所有内容都必须是递归的,所以我的基本情况是只有一个元素,在这种情况下,max是元素本身。否则,我比较第一个和第二个元素,并在适当的情况下递归调用函数:

(fn max-of
    ; base case, only one element, return the element
    ([x] x)
    ; if more than one element...
    ([x & more]
        ; ...compare the first element and the second
        ; if the first element is bigger than the second
        ; drop the second element, else drop the first 
        (if (> x (first more)) (max-of (cons x (rest more)))
                               (max-of more))))

但是这给了我:

user=>     ((fn max-of
#_=>         ([x] x)
#_=>         ([x & more]
#_=>             (if (> x (first more)) (max-of (cons x (rest more)))
#_=>                                    (max-of more))))
#_=>     1 8 3 4)
(8 3 4)

我不知道为什么这会给我一个列表而不是在列表中调用我的函数。

1 个答案:

答案 0 :(得分:1)

因为在第一次递归调用中,您将列表作为单个实体传递,请参阅

之间的区别

(max-of 8 3 4)(max-of '(8 3 4))

您可以使用apply来缓解此问题:

(apply max-of (cons x (rest more)))