带有可变参数函数的Clojure尾调用递归

Hep*_*tic 4 clojure

我基本上想要这个:

(defn mymax
        ([a b] (if (> a b) a b))
        ([a b & rest] (apply recur (conj rest (mymax a b)))))
Run Code Online (Sandbox Code Playgroud)

这样:(mymax 1 2 3 4)tail调用(mymax 2 3 4)尾调用(mymax 3 4)

我看到"应用"停止重复进入尾部位置的问题,这意味着它不起作用.但我不知道如何使用apply for variable争论功能

[注意,我知道你可以用reduce来解决这个特殊问题.只是想知道你是否可以使用变量参数进行尾调用递归]

Ank*_*kur 7

使函数将单个向量作为参数,而不是使用aruguments作为值序列.这将允许你摆脱申请.

(defn mymax [[a b & rest]]
  (let [m (if (> a b) a b)]    
    (if (not rest)
        m 
        (recur (conj rest m)))))
Run Code Online (Sandbox Code Playgroud)