这是处理带有重复元素的单个列表的nieve情况,我进入处理一些嵌套列表的结,所以我想先编写简单的案例。 所以我有:
(defn packDuplicatesIntoLists [listOfElements l e]
(if(= e 'nil)
'true
(if(= () listOfElements)
(if
(= e '())
l
(list l e)
)
(if
(= (first listOfElements) (first e) )
(packDuplicatesIntoLists (rest listOfElements) l (cons (first listOfElements) e))
(packDuplicatesIntoLists (rest listOfElements) (list l e) (first listOfElements))
)
)
) )
(packDuplicatesIntoLists '(2) '(1 1) '(2 2)) (packDuplicatesIntoLists '() '(1 1) '(2 2)) (packDuplicatesIntoLists '() '() '()) (packDuplicatesIntoLists '(1 1 1 2 2 2 3 3 3 4 4 4 4) '() '())
但是 (packDuplicatesIntoLists(rest listOfElements)(list l e)(first listOfElements)) 让我陷入困境,
#'NintyNineProblems.LearnSpace/packDuplicatesIntoLists
((1 1) (2 2 2))
((1 1) (2 2))
()
IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (RT.java:505
这条线错了吗?
答案 0 :(得分:0)
所以,它仍然会反转lsit,但尾部递归
(defn packDuplicatesIntoLists [listOfElements l e]
(if(= '() listOfElements)
(cons e l)
(if
(= (first listOfElements) (first e) )
(recur (rest listOfElements) l (cons (first listOfElements) e))
(if (= '() e)
(recur (rest listOfElements) l (list (first listOfElements)))
(recur (rest listOfElements) (cons e l) (list (first listOfElements)))
)
)
)
)
(packDuplicatesIntoLists'(2 2 2 4 4 4 5 5 5 8 8 8 6 9 9 9 9 9)'()'()) (packDuplicatesIntoLists'()'()'())(packDuplicatesIntoLists'nil'()'())