我基本上想要这个:
(defn mymax
([a b] (if (> a b) a b))
([a b & rest] (apply recur (conj rest (mymax a b)))))
这样:(mymax 1 2 3 4)
尾部调用(mymax 2 3 4)
尾调用(mymax 3 4)
我看到“应用”停止重复进入尾部位置的问题,这意味着它不起作用。但我不知道如何不能使用申请变量争论函数
[注意,我知道你可以用reduce来解决这个特殊问题。只是想知道你是否可以使用变量参数进行尾调用递归]
答案 0 :(得分:7)
使函数将单个向量作为参数,而不是使用参数作为值序列。这样你就可以摆脱申请。
(defn mymax [[a b & rest]]
(let [m (if (> a b) a b)]
(if (not rest)
m
(recur (conj rest m)))))