[英]Lisp - checking if a list is sorted
我試圖編寫一個Lisp函數,如果給出的列表按升序或降序排序,則該函數返回True。
到目前為止,我有3個輔助函數可以用任何一種方式進行排序,然后進行比較,最后通過函數確定它們是否被排序。
我在有序(L)函數中調用比較時遇到麻煩。 每次似乎都在破壞列表。 也許我的整個實現是錯誤的。 感謝您的光臨!
(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)
;)
)
怎么樣:
(defun ordered (list)
(apply #'< list))
您可以通過添加關鍵參數使其更通用:
(defun ordered (list &key (test #'<))
(apply test list))
為什么需要COMPARE,而它所做的只是用相同的參數調用EQUAL?
TEMP1是未聲明的變量。 它從何而來?
SORT具有破壞性。 您需要先復制列表。
使用諸如Hyperspec和/或Common Lisp快速參考之類的Lisp參考。 另外,還有一些有關Lisp的基本入門書籍,例如Common Lisp:符號計算的溫和介紹 。
sort
是一種破壞性操作。 您可能想要這樣的東西來ascending
:
(defun ascending (L)
(sort (copy-list L) #'<))
當然,對於descending
也是如此。 請注意本教程頁面中的最后一句話: http : //www.nano.com/lisp/cmucl-tutorials/LISP-tutorial-22.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.