Я изучаю Clojure и пытаюсь решить проблему 31 : написать функцию, которая упаковывает последовательные дубликаты в подсписки.
(= (__ [1 1 2 1 1 1 3 3]) '((1 1) (2) (1 1 1) (3 3)))
Я знаю, что могу решить это, используя идентичность, и функционально, но я хочу решить это, используя рекурсию, потому что я не до конца внедрил эту идею в своем мозгу.
Мое решение будет таким:
(defn packing [lista]
(loop [[fst snd :as all] lista mem [] tmp '(fst)]
(print "all is " all "\n\n") ;; something is wrong; it always is an empty list
(if (seq? all)
(if (= fst snd)
(recur (rest all) mem (cons snd tmp))
(recur (rest all) (conj mem tmp) (list snd)))
(seq mem))))
Моя идея - рекурсивный цикл, всегда берущий первые 2 элемента и сравнивающий. Если они совпадают, я включаю их во временный список tmp
; если они разные, я включаю свой временный список в men
. (Это мой окончательный список; лучшее имя будет final_list
.)
Поскольку он сравнивает первые 2 элемента, но в то же время ему нужен рекурсивный цикл только в обход первого элемента, я назвал весь список all
.
Я не знаю, хороша ли логика, но все же, если это не так, я не знаю почему, когда я печатаю.
(print "all is " all "\n\n") I receive an empty list