1

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

(_ 1 8 3 4)

所以结果是4。

为此,我正在尝试实现一个可变参数的功能。由于 Lisp 中的所有内容都必须是递归的,所以我的基本情况是只有一个元素,在这种情况下,最大值就是元素本身。否则,我比较第一个和第二个元素,并在适当的情况下递归调用该函数:

(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)

而且我不知道为什么这会返回一个列表而不是在所述列表上调用我的函数。

4

1 回答 1

1

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

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

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

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

于 2013-04-14T02:03:29.360 回答