Последнее утверждение - это добавление, а не вызов recur
, поэтому оно не работает.Тот факт, что он внутри if, не имеет к этому никакого отношения.(fn [coll] (let [tail (rest coll)] (+ 1 (recur tail))))
тоже не сработает.
Обычный способ превратить функцию, подобную этой, в хвостовую рекурсию - заставить функцию принять второй аргумент, который содержит аккумулятор для значения, которое высложение, а затем выполнить повторение следующим образом: (recur tail (+ acc 1))
вместо попытки добавить 1 к результату recur
.
Как правило: если вы что-то делаете с результатом recur
(как например, добавляя к нему 1), он не может быть в хвостовой позиции, поэтому он не будет работать.