Lisp - 检查列表是否已排序

时间:2011-04-10 18:35:29

标签: sorting comparison lisp

我正在尝试编写一个有序的Lisp函数,如果给出的列表按升序或降序排序,则返回True。

到目前为止,我有3个辅助函数来对任一方式进行排序,然后一个用于比较它们,最后是函数以确定它们是否已排序。

我在有序(L)函数中调用compare时遇到了麻烦。它似乎每次都在摧毁这份名单。也许我的整个实施都是错误的。谢谢你的期待!

(defun ascending (L)
   (sort L #'<)
)

(defun descending (L)
    (sort L #'>)
)

(defun compare (original sorted)
    (cond 
        ; I made this return the opposite for 
        ; easier usage in the condition of ordered
        ((equal original sorted) T) 
    )
)

(defun ordered (L) 
    ;(cond 
    (print L)
    (setq temp1 L)

    (compare L (ascending temp1))
    (print temp1)

    (print L)
    ;)
)

4 个答案:

答案 0 :(得分:3)

您无需对列表进行排序。

您只需要查看每对连续元素,看看它们是全部是升序还是降序。

对于简单的三线游戏,您需要运算符orevery>=, <=rest。请记住,列表只是一系列缺点单元格,rest只提供对第二个单元格的引用,而every可以将多个列表作为参数。然后,您可以将问题描述直接转换为Lisp代码。

答案 1 :(得分:3)

怎么样:

(defun ordered (list)
  (apply #'< list))

您可以通过添加关键参数使其更通用:

(defun ordered (list &key (test #'<))
  (apply test list))

答案 2 :(得分:2)

  • 为什么你需要COMPARE,当它只是用相同的参数调用EQUAL时?

  • TEMP1是未声明的变量。它来自哪里?

  • SORT具有破坏性。您需要先复制列表。

使用类似Hyperspec和/或Common Lisp快速参考的Lisp引用。 还有一些基本的Lisp入门书籍,如Common Lisp: A Gentle Introduction to Symbolic Computation

答案 3 :(得分:1)

sort是一种破坏性的操作。对于ascending

,你可能想要这样的东西
(defun ascending (L)
  (sort (copy-list L) #'<))

当然,descending也有类似的东西。请注意本教程页面中的最后一句:http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-22.html