Нет необходимости в рекурсии, просто вложенный в петлю простой элемент
(defn subs
[seq]
(let [c (count seq)]
(remove empty?
(for [x (range c) y (range (- (inc c) x))]
(take y (drop x seq))))))
и еще один
(defn subs
[seq]
(letfn [(take-len [f s] (take (count s) (iterate f s)))]
(mapcat #(reverse (take-len butlast %)) (take-len next seq))))
Только что заметил, что это примерно то же самое, что и версия e-i-s. Я пытался свернуть мою собственную версию butlast (из-за симметрии с «iterate next»), но никто не делал вещи более краткими, чем вложенные циклы for. До тех пор, пока я не нашел butlast на clojuredocs.
В любом случае, попробуйте проблемы 4clojure. Неспособность найти ответы действительно заставляет вас найти ответ, любой ответ, который работает, и если вы делаете / сделали, вы найдете более элегантный ответ. И если у вас нет идеи, обычно есть ответы других пользователей, которые просвещают или вдохновляют после того, как вы это решили.