list - 重新排列 lisp 中的列表元素

标签 list lisp common-lisp

我的 AI 类(class)中有这个项目,用 lisp 编写一些函数,但我不明白为什么我的一个函数不能正常工作。该函数应该将一个列表作为参数并返回一个列表,其中出现多次的给定列表中的参数被组合在一起,如下所示: (2, 4, 6, 5, 4, 6, 7, 2, 3, 4, 75, 87) -> ( 2, 2, 4, 4, 4, 6, 6, 5, 7,3, 75, 87). 我首先创建了两个函数,一个从给定列表 (brisi ( x, l) ) 中删除给定参数,另一个计算元素 x 在列表 l 中出现的次数 ( brojPonavljanja (x, l) )

(defun brisi (x l)
  (setq duz (length l))
  (setq i 0)
  (setq br 0)
  (loop
    (when (= i duz)
      (return)
    )
    (when (= x (nth i l))
      (incf br)
    )
    (incf i)
  )
  (setq duz1 (- duz br))
  (setq l1 (make-list duz1))
  (setq j 0)
  (setq i 0)
  (loop
    (if (/= x (nth i l))
      (progn
        (setf (nth j l1) (nth i l))
        (incf i)
        (incf j)
      )
      (incf i)
    )
    (when (= i duz)
      (return l1)
    )
  )
)
( defun brojPojava (x l)
  (if ( null l)
    0
    ( if (= (car l) x)
        (+ 1 (brojPojava x (cdr l)))
        (brojPojava x (cdr l))
    )
  )
)
(defun skupi(l)
  (setq duz (length l))
  (setq l1 (make-list duz))
  (setq i 0)
  (setq pos 0)
  (loop
    (when (= i (length l))
      (return l1)
    )
    (setf elem (nth i l))
    (setf br (brojPojava elem l))
    (when (> br 1)
      (setf l (brisi elem l))
      (setq j 0)
      (loop
        (when (= br j)
          (return)
        )
        (setf (nth pos l1) elem) ; <-- ######
        (incf j)
        (incf pos)
      )
      (setq i -1)
    )
    (incf i)
  )
)

所以最后一个函数 skupi(l) 产生了问题。我确实注意到了一个奇怪的事件,有一次我使用我的 brisi 函数删除列表中重复的元素并将其复制到一个新列表,但是我从中删除重复元素的列表(列表 l)在之后突然发生变化一行代码(我在那一行放了一个箭头和几个#)。我不知道为什么会这样。

最佳答案

你的风格不太像功能性的。例如,您可以按照以下(不是最有效但更简洁)的方式编写它:

(defun group-list (lst)
  (when lst
    (nconc (make-list (count (car lst) lst) :initial-element (car lst))
      (group-list (remove (car lst) lst)))))

虽然我提供解决方案是为了学习,而不是为了复制粘贴。

关于list - 重新排列 lisp 中的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267648/

相关文章:

algorithm - 就地插入排序 LISP

python - 如何遍历列表中除最后一项之外的所有内容?

c# - 返回匿名类型列表的方法使用什么返回类型?

macros - 如何修复我的第一个 Lisp 宏?

java - 将语言映射到范式

lisp - 彩票代码更正

python - 如何统计一个列表中相同值的最长序列,然后输出一个元组中的最大序列

python - 在列表 python 中附加零但不是 False

functional-programming - Scheme:返回另一个内部过程的过程

mongodb - 使用 cl-mongo 时如何表达 $or