我正在尝试编写一个有序的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)
;)
)
答案 0 :(得分:3)
您无需对列表进行排序。
您只需要查看每对连续元素,看看它们是全部是升序还是降序。
对于简单的三线游戏,您需要运算符or
,every
,>=
, <=
和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