实际上,David的算法给出了更好的结果,因为最佳顺序也取决于起点。
下面的列表是区分算法的一个很好的示例:
使用Alan/Renderman的方法:
以上代码:
上面有David的代码:
这是选择正确的起点开始算法的结果。因此,我可以通过以下方法改进代码:
- (defun sort ( lst / _sort a b d e l p )
- (defun _sort ( a b )
- (if a (cons a (_sort (car (setq b (vl-sort b '(lambda ( c d ) (< (distance a c) (distance a d)))))) (cdr b))))
- )
- (setq l (cdr lst)
- d (distance (setq p (car lst)) (car l))
- )
- (while (setq a (car l))
- (foreach b (setq l (cdr l))
- (if (< d (setq e (distance a b))) (setq p a d e))
- )
- )
- (_sort p (vl-remove p lst))
- )
现在导致:
但是,虽然更简洁,但由于其递归性质,我的可能远不如David的高效。 |