我是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)
我不知道为什么这会给我一个列表而不是在列表中调用我的函数。
答案 0 :(得分:1)
因为在第一次递归调用中,您将列表作为单个实体传递,请参阅
之间的区别 (max-of 8 3 4)
和(max-of '(8 3 4))
您可以使用apply
来缓解此问题:
(apply max-of (cons x (rest more)))