Clojure 循环递归中绑定的奇怪行为

Clojure 循环递归中绑定的奇怪行为,clojure,Clojure,我正在学习Clojure,并试图解决以下问题:编写一个函数,将连续的重复项打包到子列表中 (= (__ [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)] (

我正在学习Clojure,并试图解决以下问题:编写一个函数,将连续的重复项打包到子列表中

(= (__ [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\u list

因为它比较前两项,但同时只需要一个递归循环绕过第一项,所以我将整个列表命名为
all

我不知道逻辑是否正确,但如果这是错误的,我不知道为什么我打印时

 (print "all is   "    all   "\n\n") I receive an empty list
有几点:

  • ”(fst)
    创建一个包含符号
    fst
    的列表,而不是
    fst
    的值,这是首选使用向量的原因之一,例如
    [fst]
  • 您应该避免假设输入不是空的
  • 您可以对列表和向量使用
    conj
  • 解构是可嵌套的
(除包装[coll] (循环[[x&[y:as more]:as all]coll 结果[] 相同的“()” (如有的话) (如果(=x y) (重复更多结果(合并相同的x)) (重复更多(连体结果(连体相同x))'()) (结果) 有几点:

  • ”(fst)
    创建一个包含符号
    fst
    的列表,而不是
    fst
    的值,这是首选使用向量的原因之一,例如
    [fst]
  • 您应该避免假设输入不是空的
  • 您可以对列表和向量使用
    conj
  • 解构是可嵌套的
(除包装[coll] (循环[[x&[y:as more]:as all]coll 结果[] 相同的“()” (如有的话) (如果(=x y) (重复更多结果(合并相同的x)) (重复更多(连体结果(连体相同x))'()) (结果)
在您的代码中,并非所有内容都是空的。只有无限循环才会发生,而且您总是会看到一个空列表…在您可以看到的第一行中,它的工作方式与预期的不同

错误在(seq?all)中,因为空列表也是seq。。。尝试(seq?'())并返回true…然后执行一个空循环 您需要为(空?所有)代码更改此选项 另一个错误是“(fst),因为它返回simbol fst而不是值…将其更改为(list fst)


在您的代码中,并非所有内容都是空的。只有无限循环才会发生,而且您总是会看到一个空列表…在您可以看到的第一行中,它的工作方式与预期的不同

错误在(seq?all)中,因为空列表也是seq。。。尝试(seq?'())并返回true…然后执行一个空循环 您需要为(空?所有)代码更改此选项 另一个错误是“(fst),因为它返回simbol fst而不是值…将其更改为(list fst)

(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)))
(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))))))