W projekcie nad którym pracuję natknąłem się na interesujący problem, który mnie interesuje z innymi rozwiązaniami. Jestem w trakcie czytania "The Little Schemer", więc wypróbowuję niektóre techniki rekursji. Zastanawiam się, czy istnieje inny sposób, aby to zrobić z rekursją, a także zainteresowany, jeśli istnieje podejście bez użycia rekursji.Partycjonowanie seq - Rekursja w Clojure (lub Lisp w ogóle)
Problem polega na wykonaniu sekwencji i podzieleniu jej na seqs seqs, biorąc co n-ty element. Na przykład ten wektor:
[ :a :b :c :d :e :f :g :h :i ]
gdy podzielono między n = 3 będzie produkować Seq
((:a :d :g) (:b :e :h) (:c :f :i))
o N = 4:
((:a :e :i) (:b :f) (:c :g) (:d :h))
i tak dalej. Rozwiązałem to za pomocą dwóch funkcji. Pierwszy tworzy wewnętrzne seqs, a drugi ściąga je razem. Oto moje funkcje:
(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))))))
nie jestem całkowicie zadowolony z funkcją partycja-po-n-ty posiadającej wiele arity prostu dla rekursji, ale nie widział innego sposobu.
Wygląda na to, że działa dobrze we wszystkich przypadkach testowych. Czy to przyzwoite podejście? Czy to zbyt skomplikowane? Czy istnieje sposób, aby to zrobić bez rekurencji, a może w jednej funkcji rekurencyjnej?
Dzięki za sugestie. Jestem nowy zarówno dla Clojure'a, jak i Lispa, więc podchodzę do różnych technik.
Dzięki, że jest niesamowite!Nie miałem pojęcia, że to może być takie łatwe. Właśnie wtedy, gdy myślę, że zaczynam to rozumieć, pokazałem, jak mało robię. –
Znam to uczucie! – JohnJ
@DaveKincaid: Powinieneś spróbować modelować swoje rozwiązanie za pomocą istniejących funkcji wysokiego rzędu zamiast używać rekursji i na pewno będziesz w stanie wymyślić tego rodzaju zwięzłe rozwiązania :) – Ankur