簡體   English   中英

Lisp-檢查列表是否已排序

[英]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))

您無需對列表進行排序。

您只需要查看每對連續的元素,然后查看它們是全部遞增還是遞減。

對於簡單的三班輪,您需要運算符orevery >=<=rest 請記住,列表只是一個由cons單元組成的鏈, rest只是提供了對第二個單元的引用, every列表every可以將多個列表作為參數。 然后,您可以將問題描述直接轉換為Lisp代碼。

  • 為什么需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM