2012-01-08 73 views
4

Clojure的尾部调用递归基本上,我想这一点:带有可变参数功能

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

我看到“应用”的问题停止复发中是尾部的位置,这意味着它不会工作。但我不明白我不能如何申请变量论证函数

[注意,我知道你可以通过减少来解决这个特定的问题。只是想知道你是否可以用变量参数做尾部回调递归]

+0

相关:http://stackoverflow.com/questions/3670010/apply-recur-macro-in-clojure – Jonas 2012-01-08 06:28:40

回答

7

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

(defn mymax [[a b & rest]] 
    (let [m (if (> a b) a b)]  
    (if (not rest) 
     m 
     (recur (conj rest m)))))