我正在学习Clojure,我正在尝试解决Problem 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))))
我的想法是一个递归循环,总是占用前两项并进行比较。如果它们是相同的数字,我将其包含在临时列表tmp
中;如果它们不同,我将我的临时列表包含在men
中。 (这是我的最终名单;更好的名称是final_list
。)
因为它比较前两个项目,但同时它只需要绕过第一个项目的递归循环,我将整个列表命名为all
。
我不知道逻辑是好还是包容如果这是错误的我不知道为什么我打印时。
(print "all is " all "\n\n") I receive an empty list
答案 0 :(得分:1)
几点:
'(fst)
创建一个包含符号fst
的列表,而不是fst
的值,这是偏好使用向量的原因之一,例如[fst]
conj
用于列表和向量(defn packing [coll] (loop [[x & [y :as more] :as all] coll result [] same '()] (if all (if (= x y) (recur more result (conj same x)) (recur more (conj result (conj same x)) '())) result)))
答案 1 :(得分:0)
在你的代码中所有都不是空的..只是一个无限循环而且你总是会看到一个空列表...在你可以看到的第一行,而不是像预期的那样......
错误在(seq?all)因为空列表也是seq ...尝试(seq?'(())并返回true ...然后你做一个空循环 你需要改变这个(空?所有)你的代码 其他错误是'(fst)因为它返回了simbol fst而不是值...改为(list fst)
(defn badpacking [lista]
(loop [[fst snd :as all] lista mem [] tmp (list fst)]
(if (empty? all)
(seq mem)
(if (= fst snd)
(recur (rest all) mem (cons snd tmp))
(recur (rest all) (conj mem tmp) (list snd))))))