Нет рекурсии требуется, только вложенный равнина оле для петель
(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))))
Просто заметил, что это примерно так же, как электронная является: версия. Попробовал свернуть мою собственную версию butlast (из-за симметрии с «итерацией следующего»), но ни одна из них не делала вещи более краткими, чем вложенные для циклов. До тех пор, пока я не обнаружил, что он остался на clojuredocs.
В любом случае, попробуйте проблемы с 4clojure. Невозможность дойти до ответов действительно заставляет вас найти ответ, любой ответ, который работает, и если вы это сделаете/сделали, вы найдете более элегантный. И если вы не знаете, обычно есть ответы других пользователей, которые просветят или вдохновят вас после того, как вы ее разрешите.
Подумайте, рекурсивно. Если бы вы могли генерировать все подпоследовательности '(2 3)', могли бы вы получить все подпоследовательности '(1 2 3)'? – Peteris