Ben Common Lisp hızlı tür bir uygulama ile gelip çalıştık ve bu ana kadar ne var ise:Lisp kodunda artıklık nasıl kaldırılır?
(defun quick-sort (list)
(if (cdr list)
(let ((pivot (car list)))
(append (quick-sort (remove-if-not (lambda (n) (< n pivot)) list))
(remove-if-not (lambda (n) (= n pivot)) list)
(quick-sort (remove-if-not (lambda (n) (> n pivot)) list))))
list))
Anlaşılan o çalışıyor, ama çok fazla tekrarı ki olduğunu düşünüyorum kodu. >
vs <
vs =
tarafından
(remove-if-not (lambda (n) (< n pivot)) list)
üç aramalar farklılık tek yolu: Temel olarak üç kez var.
Bu nedenle sorum şu: Bu fazlalığı nasıl kaldırabilirim ve kodu daha okunabilir ve daha kompakt hale getirebilirim?
Tabi ki gibi bir işleve şeyler, ayıklamak olabilir:
(defun which (operator pivot list)
(remove-if-not (lambda (n) (funcall operator n pivot)) list))
(defun quick-sort (list)
(if (cdr list)
(let ((pivot (car list)))
(append (quick-sort (which #'< pivot list))
(which #'= pivot list)
(quick-sort (which #'> pivot list))))
list))
Ama nedense bu en iyi yaklaşım olup olmadığını gerçekten ikna olmadım. Yine pivot
ve list
'u tekrar tekrar ele geçirmek zorunda kalıyor.
Ben de fikri fonksiyonunun gerçek vücut daha okunabilir hale getirir flet
, kullanmak, ama sadece başka bir yere karmaşıklığı taşır:
(defun quick-sort (list)
(if (cdr list)
(let ((pivot (car list)))
(flet ((left() (remove-if-not (lambda (n) (< n pivot)) list))
(middle() (remove-if-not (lambda (n) (= n pivot)) list))
(right() (remove-if-not (lambda (n) (> n pivot)) list)))
(append (quick-sort (left))
(middle)
(quick-sort (right)))))
list))
Başka yaklaşımlar?
Lisp'deki bu Quicksort uygulamasının, Kent Pitman'ın [Koyun Tricki] 'da (http://www.maclisp.info/pitmanual/funnies.html#sheep_trick) açıkladığı bir göz atın. –