为什么这种排序算法能够达到预期的效果? [Lisp的]

时间:2015-08-12 16:30:12

标签: sorting lisp common-lisp

我正在做旧考试,为自己的考试做好准备,教授也很好,也给了我们解决方案,现在我想知道为什么一个功能会做什么呢?'应该是。

(defun sortulists (L)
  (mapcar (lambda (uliste)
            (sort uliste (lambda (x1 x2)
                           (or (symbolp x2)
                               (and (numberp x1) (numberp x2)
                                    (< x1 x2))))))
          L))

它应该使用一个列表L,其中包含未分类的子列表,这些子列表可能包含数字和原子,并先排序它的数字,然后将符号放在最后。

当像(sortulists '((A 9 b h 2) (1 m n 9 8) (5 a 7)))这样调用时,它会返回((2 9 H B A) (1 8 9 N M) (5 7 A))

任何帮助?

编辑:修正缩进

3 个答案:

答案 0 :(得分:6)

sort函数的谓词说明序列排序后测试必须为真。如何定义排序。

如果您在这里使用andor时遇到困难,建议您阅读Common Lisp: A Gentle Introduction to Symbolic Computation条件一章。它显示了如何交换cond,嵌套if以及组合andor,并提供练习(及其解决方案)。

简而言之,要么右边有一个符号,要么两个都是数字,它们必须按大小排序。

答案 1 :(得分:6)

(or
    ; if x2 is a symbol, then x1 is smaller, whatever x1 is
    (symbolp x2)

    ; if both are numbers, then return t if x1 is smaller than x2
    (and (numberp x1) (numberp x2)
         (< x1 x2)))

所以这些数字是在前面排序的。符号在最后,但未分类。

答案 2 :(得分:3)

所以要说清楚:

(defun sortulists (L)
  (mapcar (lambda (uliste)
            (sort uliste (lambda (x1 x2)
                           (or (symbolp x2)
                               (and (numberp x1) (numberp x2)
                                    (< x1 x2))))))
          L))

mapcar只列出了对每个元素应用匿名函数的列表。因此,只需关注一个元素'(A 9 b h 2)即可:

;; same as the anonymous lambda, but named so we can test it a little
(defun my< (x1 x2)
  (or (symbolp x2)
      (and (numberp x1) (numberp x2)
           (< x1 x2))))

(sort '(A  9  b  h  2) #'my<) ; ==> (2 9 B H A)

(my< 2 'a)                    ; ==> T 
(my< 2 3)                     ; ==> T
(my< 3 3)                     ; ==> NIL
(my< 'a 2)                    ; ==> NIL
(my< 'a 'b)                   ; ==> T
(my< 'b 'a)                   ; ==> T

如果my<是符号,则x1 x2小于x2。如果x1都是数字且x1算术小于x2,则x1也会更小。对于其他所有内容x2等于或大于t

如果在参数列表中混合一些符号,您可能会看到符号的顺序与原始列表的顺序不同。原因是两个符号的比较将成为'a两种方式,因此'b小于'b'a小于(stable-sort '(A 9 b h 2) (lambda (x1 x2) (and (numberp x1) (or (not (numberp x2)) (< x1 x2))))) ; ==> (2 9 A B H) 。我们在结果中保持符号顺序的版本如下所示:

stable-sort

注意我使用sort函数,因为<!DOCTYPE html> <html> <head> <title></title> <script src="jquery.min.js" type="text/javascript"></script> </head> <body> <style> #nav li ul { display: none; } </style> <div id="nav"> <li><a href="javascript:void(0)">Subject</a> <ul> <li><a href="">Subject</a></li> </ul> </li> <li><a href="">Subject</a></li> <li><a href="javascript:void(0)">Subject</a> <ul> <li><a href="">Subject</a></li> </ul> </li> <li><a href="">Subject</a></li> </div> <script> $(document).ready(function() { $('#nav li a').click(function() { $('#nav li ul').hide(); $(this).next('ul').fadeIn(); }); }); </script> </body> </html> 不能保证稳定。稳定意味着相等的对象保持与源相同的顺序。