Clojure рекурсия вызова хвоста с переменной функцией аргумента - PullRequest
4 голосов
/ 08 января 2012

Я в основном хочу это:

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

Я вижу проблему, когда «apply» перестает возвращаться в хвостовое положение, что означает, что это не сработает. Но я не понимаю, как я не могу использовать применить для переменных аргументных функций

[Обратите внимание, я знаю, что вы можете решить эту конкретную проблему с помощью Reduce. Просто интересно, можно ли выполнить хвостовую рекурсию с переменными параметрами]

1 Ответ

7 голосов
/ 08 января 2012

Заставьте функцию принимать один вектор в качестве аргумента, а не использовать аргументы в качестве последовательности значений. Это позволит вам избавиться от применения.

(defn mymax [[a b & rest]]
  (let [m (if (> a b) a b)]    
    (if (not rest)
        m 
        (recur (conj rest m)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...