我的任務是創建一個程序,在其中我需要一個函數來返回一個排序列表(按字母順序)。但是,我無法使用和「非功能性」功能,例如「set,setq」等......並且包括內置的排序功能(因爲它具有破壞性)。所以,我想知道是否有辦法在lisp中構建一個非破壞性的排序?lisp中的非破壞性排序?
2
A
回答
2
最簡單的方法是在排序前進行復制:
(sort (copy-seq input) predicate)
或者你自己寫一個排序函數,例如快速排序:
(defun qsort (input predicate)
(if input
(let* ((pivot (first input))
(rest (rest input))
(lesser (remove-if-not #'(lambda (x)
(funcall predicate x pivot))
rest))
(greater (remove-if-not #'(lambda (x)
(not (funcall predicate x pivot)))
rest)))
(append (qsort lesser predicate)
(list pivot)
(qsort greater predicate)))
nil))
注意,人們可以優化這個檢測列表已經排序休息,使無序和有序列表之間的結構共享。
0
如果您的破壞性排序交換了兩個相鄰元素,這些元素被完整保留的元素所包圍,那麼非破壞性的方法是創建一個由兩個交換元素組成的新列表,其中包含其他元素。然後,使用該新列表作爲後續排序操作的基礎。
破壞性地說,你的工作列表從開始到結束都是一樣的,你可以通過在另一個「地方」替換一個「地方」中的值來修改它。無損地在每一步創建一個新的列表,成爲工作列表。
我會將實施留給您。
相關問題
- 1. 非破壞性spl_autoload_register
- 2. 什麼是java中的破壞性和非破壞性方法?
- 3. 什麼是lisp的非破壞性版本?
- 4. 歸併 - 破壞性與非破壞性Java中
- 5. npm非破壞性更新
- 6. Ruby中的非破壞性拆分
- 7. OpenGL中的非破壞性濾鏡
- 8. Javascript中破壞性與非破壞性方法的命名約定
- 9. Common Lisp的歸併排序打破
- 10. java2d對象的非破壞性轉換
- 11. 非破壞性的全屏mobclix廣告
- 12. 爲什麼ListAppend是非破壞性的,而ArrayAppend和StructInsert都具有破壞性?
- 13. 非破壞性原子添加?
- 14. PHP - 非破壞性輸入消毒
- 15. AutoMapper非破壞性列表覈對?
- 16. C:指向數組的指針和破壞性排序
- 17. 重新排序獨立類中的公共非虛方法是否破壞ABI?
- 18. Javascript中的非破壞斷點(trace points)?
- 19. iPhone UILabel - 非破壞空間
- 20. XML非破壞空間
- 21. LISP中的快速排序
- 22. 破壞秩序
- 23. 要我打電話添加到列表中的Emacs Lisp破壞性的功能?
- 24. 從散列中刪除密鑰的非破壞性方法
- 25. 查找和替換Bash中的非破壞性空格字符
- 26. 非破壞性地解析和修改C++中的HTML元素
- 27. 在破壞性Lisp函數名稱中,「N」是什麼單詞的縮寫?
- 28. 破壞性的Git提交?
- 29. 是CALayer insertSublayer:atindex:破壞性的?
- 30. 破壞不破壞
這功課嗎?否則,這種限制聽起來像純粹的蠱惑。不,你在Common Lisp中沒有非破壞性的排序。要務實,只需創建一個複製序列的函數,在副本上運行'sort'並返回'sort'的結果。然後你可以假設或假裝這個新功能是非破壞性的。不要誤解我的意思,只要功能與非功能性方法一樣快,我就會喜歡純粹的功能性代碼,並且不會強迫我跳過。如果你被要求跳躍,你必須自己實現功能排序。 – acelent
我認爲在通常的lisp中,這樣做的典型方式就是在列表的新副本上使用破壞性排序。這符合「功能」api,因爲調用者可以觀察到任何副作用,並且相同的輸入始終獲得相同的輸出。 –