프로젝트에서 나는 다른 솔루션에 대해 궁금한 흥미로운 문제를 발견했다. 나는 "The Little Schemer"를 읽는 중이다. 그래서 나는 재귀 기술을 시험 중이다. 재귀를 사용하여이 작업을 수행하는 또 다른 방법이 있는지, 그리고 재귀를 사용하지 않고 접근법이 있는지 궁금합니다.Clojure (또는 일반적으로 Lisp)에서 seq - Recursion 분할하기
문제는 시퀀스를 취하여 모든 n 번째 요소를 취하여 seq의 seq로 분할하는 것입니다. 예를 들어,이 벡터 :
서열을((:a :d :g) (:b :e :h) (:c :f :i))
와 함께 N = 4를 생성 할 N = 3으로 분할
[ :a :b :c :d :e :f :g :h :i ]
:
((:a :e :i) (:b :f) (:c :g) (:d :h))
등등. 두 가지 기능을 사용하여이 문제를 해결했습니다. 첫 번째는 내부 seq를 만들고 다른 하나는 내부 seq를 만듭니다. 여기 내 기능은 다음과 같습니다
(defn subseq-by-nth
"Creates a subsequence of coll formed by starting with the kth element and selecting every nth element."
[coll k n]
(cond (empty? coll) nil
(< (count coll) n) (seq (list (first coll)))
:else (cons (nth coll k) (subseq-by-nth (drop (+ n k) coll) 0 n))))
(defn partition-by-nth
""
([coll n]
(partition-by-nth coll n n))
([coll n i]
(cond (empty? coll) nil
(= 0 i) nil
:else (cons (subseq-by-nth coll 0 n) (partition-by-nth (rest coll) n (dec i))))))
단순히 재귀에 대해 여러 인수에 대응을 갖는 파티션별로 n 번째의 기능을 완전히 행복하지 않다,하지만 다른 방법을 볼 수 없었다.
모든 테스트 사례에서 제대로 작동하는 것 같습니다. 이것은 괜찮은 접근인가? 너무 복잡합니까? 재귀 또는 일회성 재귀 함수없이이 작업을 수행 할 수있는 방법이 있습니까?
제안 해 주셔서 감사합니다. 나는 Clojure와 Lisp에 익숙하지 않기 때문에 다른 기술을 선택하고있다.
감사합니다, 그것은 굉장합니다!나는 그것이 그렇게 쉬울 수 있는지 전혀 몰랐다. 내가 이것을 이해하기 시작하고 있다고 생각할 때 나는 정말로 내가 얼마나 작은지를 보여 주었다. –
나는 그 감각을 알고있다! – JohnJ
@DaveKincaid : 재귀를 사용하는 대신 기존의 고차 함수를 사용하여 솔루션을 모델링해야하며이 종류의 간결한 솔루션을 제공 할 수 있어야합니다. – Ankur