2012-01-08 96 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)))))