【问题标题】:NP-Complete Appetizers bugNP-Complete 开胃菜错误
【发布时间】:2014-07-30 03:18:10
【问题描述】:

我正在尝试使用 Common Lisp 以蛮力方式解决 this。用于教育和娱乐目的。

这是代码

(defparameter +items+
  '((:mixed-fruit 215)
    (:french-fries 275)
    (:side-salad 335)
    (:hot-wings 355)
    (:mozzarella-sticks 420)
    (:sampler-plate 580)))

(defun appetizers (limit items)
  (let ((res (make-hash-table :test 'equal)))
    (labels ((rec (total acc)
               (if (= total limit)
                   (setf (gethash (sort acc #'string<= :key #'symbol-name) res) total)
                   (loop for (name val) in items for 
                         new-total = (+ total val)
                         when (>= limit new-total) 
                           do (rec new-total (cons name acc))))))
      (rec 0 nil)
      (alexandria:hash-table-alist res))))

我认为这应该给我正确的结果。给定一个limit 和一个(&lt;item-name&gt; &lt;price&gt;) 的表

  1. 0 和空列表开始。
  2. 如果总和等于limit,则对该结果进行排序并存储。
  3. 对于输入项目表中的每个项目,如果将其添加到已选择项目的价格将小于或等于限制,则重复其成本添加到运行总计,并添加到已选择项目列表。
  4. 完成后,收集所有记录的结果。

问题是,它返回不正确的输出:

CL-USER> (appetizers 1505 +items+)
(((:HOT-WINGS :HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE)
  . 1505)
 ((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :SAMPLER-PLATE) . 1505)
 ((:HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE
   :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE)
  . 1505)
 ((:HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
   :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE)
  . 1505)
 ((:MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE) . 1505)
 ((:HOT-WINGS :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE) . 1505)
 ((:HOT-WINGS :HOT-WINGS :HOT-WINGS :SAMPLER-PLATE :SAMPLER-PLATE
   :SAMPLER-PLATE)
  . 1505)
 ((:SAMPLER-PLATE :SAMPLER-PLATE) . 1505)
 ((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
   :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE)
  . 1505)
 ((:HOT-WINGS :HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE
   :SAMPLER-PLATE :SAMPLER-PLATE)
  . 1505)
 ((:MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE)
  . 1505))
CL-USER> 

它声称它们每个都是1505 的开胃菜,但实际上不是:

CL-USER> (defun cost-of (chosen-items items)
            (loop for i in chosen-items
                  sum (second (assoc i items))))
COST-OF
CL-USER> (loop for (lst . quote-total-endquote) 
                 in (appetizers 1505 +items+)
               collect (cost-of lst +items+))
(2075 1505 3320 3535 1375 2095 2805 1160 3525 3235 2170)
CL-USER> 

如果我尝试一步一步地打印出来

(defun appetizers (limit items)
  (let ((res (make-hash-table :test 'equal)))
    (labels ((rec (total acc)
               (format t "Recurring with ~s ~s~%" total acc)
               (if (= total limit)
                   (progn 
                     (format t "Done: ~s ~s (~s)~%" total acc (cost-of acc items))
                     (setf 
                        (gethash (sort acc #'string<= :key #'symbol-name) res) 
                        total))
                   (loop for (name price) in items 
                         for new-total = (+ total price)
                         when (>= limit new-total) 
                           do (rec new-total (cons name acc))))))
      (rec 0 nil)
      (alexandria:hash-table-alist res))))

我得到了一些相当奇怪的结果

CL-USER> (appetizers 1505 +items+)
Recurring with 0 NIL
Recurring with 215 (:MIXED-FRUIT)
Recurring with 430 (:MIXED-FRUIT :MIXED-FRUIT)
Recurring with 645 (:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT)
Recurring with 860 (:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT)
Recurring with 1075 (:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
                     :MIXED-FRUIT)
Recurring with 1290 (:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
                     :MIXED-FRUIT :MIXED-FRUIT)
Recurring with 1505 (:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
                     :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT)
Done: 1505 (:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
            :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT) (1505)
Recurring with 1350 (:FRENCH-FRIES :MIXED-FRUIT) ;; wrong
Recurring with 1410 (:SIDE-SALAD :MIXED-FRUIT)   ;; wrong
Recurring with 1430 (:HOT-WINGS :MIXED-FRUIT)    ;; wrong

所有标记为wrong 的行似乎都有一个:mixed-fruit 的价格为1075,实际上是5x:mixed-fruit 的价格。

我已经盯着这个足够长的时间了,我很确定我自己找不到这个错误。我这里哪里出错了?

【问题讨论】:

    标签: common-lisp knapsack-problem


    【解决方案1】:

    函数sort是破坏性的;允许破坏性地修改列表。当您逐步构建和存储列表时,这会导致奇怪的结果。首先,让我们看一个简单的例子。下面的结果是我使用 SBCL 得到的结果,但实现可以做不同的事情。

    (loop
       for n from 0 below 5
       for l = (list n) then (list* n l)
       collecting (sort l '<))
    ;=> ((0 1 2 3 4) (0 1 2 3 4) (1 2 3 4) (2 3 4) (3 4))
    

    您真正想要的是在排序之前复制列表:

    (loop
       for n from 0 below 5
       for l = (list n) then (list* n l)
       collecting (sort (copy-list l) '<))
    ;=> ((0) (0 1) (0 1 2) (0 1 2 3) (0 1 2 3 4))
    

    这如何应用于您的代码?你使用 sort 在:

    (setf (gethash (sort acc #'string<= :key #'symbol-name) res) total)
    

    这意味着您第一次这样做时,您将正确的列表存储在哈希表中,但 acc 本身可能不再是您期望的那样,并且在随后的迭代中,您可以再次修改列表结构,这也可能会修改表中的键。如果您对 acc 而不是 acc 的副本排序,您会得到不同的结果。比较这个更新的代码和结果:

    (defun appetizers (limit items)
      (let ((res (make-hash-table :test 'equal)))
        (labels ((rec (total acc)
                   (if (= total limit)
                       (setf (gethash (sort (copy-list acc) #'string<= :key #'symbol-name) res) total) 
                                            ;;^^^^^^^^^^^^^
                       (loop for (name val) in items for 
                             new-total = (+ total val)
                             when (>= limit new-total) 
                               do (rec new-total (cons name acc))))))
          (rec 0 nil)
          (hash-table-alist res))))
    

    CL-USER> (appetizers 1505 +items+)
    (((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :SAMPLER-PLATE) . 1505)
     ((:MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT) . 1505))
    

    要查看 acc 发生了哪些类型的修改,您可以将一些调试输出添加到您的 loop。例如,

    (defun appetizers (limit items)
      (let ((res (make-hash-table :test 'equal)))
        (labels ((rec (total acc)
                   (if (= total limit)
                       (setf (gethash (sort acc #'string<= :key #'symbol-name) res) total)
                       (loop for (name val) in items for 
                             new-total = (+ total val)
                          with acc2 = (copy-list acc)
                          when (>= limit new-total)
                          do (rec new-total (cons name acc))
                             (when (not (equal acc2 acc))
                               (format t "~&changed from ~a to ~a" acc acc2))))))
          (rec 0 nil)
          (hash-table-alist res))))
    

    CL-USER> (appetizers 1505 +items+)
    changed from (MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT
                                               MIXED-FRUIT MIXED-FRUIT
                                               MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT
                                                           MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                                                   MIXED-FRUIT
                                                                                   MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                                                   MIXED-FRUIT
                                                                                   MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                                                   MIXED-FRUIT
                                                                                   MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                                                   MIXED-FRUIT
                                                                                   MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                                                   MIXED-FRUIT
                                                                                   MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT
                                                                                   MIXED-FRUIT
                                                                                   MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT) to (MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT) to (MIXED-FRUIT)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                         HOT-WINGS
                                                                         MIXED-FRUIT
                                                                         MIXED-FRUIT
                                                                         MIXED-FRUIT
                                                                         MIXED-FRUIT
                                                                         MIXED-FRUIT
                                                                         MIXED-FRUIT
                                                                         MIXED-FRUIT)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  SAMPLER-PLATE) to (HOT-WINGS MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  SAMPLER-PLATE) to (HOT-WINGS MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS HOT-WINGS
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS MIXED-FRUIT
                                                   MIXED-FRUIT MIXED-FRUIT
                                                   MIXED-FRUIT MIXED-FRUIT
                                                   MIXED-FRUIT MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE) to (MIXED-FRUIT)
    changed from (MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE) to (MIXED-FRUIT)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS
                                                                 SAMPLER-PLATE
                                                                 MIXED-FRUIT
                                                                 MIXED-FRUIT
                                                                 MIXED-FRUIT
                                                                 MIXED-FRUIT
                                                                 MIXED-FRUIT
                                                                 MIXED-FRUIT
                                                                 MIXED-FRUIT
                                                                 SAMPLER-PLATE
                                                                 SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE) to (MIXED-FRUIT)
    changed from (HOT-WINGS MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                           MIXED-FRUIT
                                                           HOT-WINGS)
    changed from (MIXED-FRUIT SAMPLER-PLATE) to (MIXED-FRUIT HOT-WINGS)
    changed from (MIXED-FRUIT SAMPLER-PLATE) to (MIXED-FRUIT HOT-WINGS)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE MIXED-FRUIT SAMPLER-PLATE)
    changed from (MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE) to (MIXED-FRUIT
                                                               HOT-WINGS)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS)
    changed from (MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE) to (MIXED-FRUIT
                                                                             HOT-WINGS
                                                                             HOT-WINGS
                                                                             HOT-WINGS
                                                                             MIXED-FRUIT
                                                                             SAMPLER-PLATE
                                                                             SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS HOT-WINGS
                                                   HOT-WINGS MIXED-FRUIT
                                                   SAMPLER-PLATE SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS HOT-WINGS
                                                   HOT-WINGS MIXED-FRUIT
                                                   SAMPLER-PLATE SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS HOT-WINGS
                                                   HOT-WINGS MIXED-FRUIT
                                                   SAMPLER-PLATE SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS HOT-WINGS
                                                   HOT-WINGS MIXED-FRUIT
                                                   SAMPLER-PLATE SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS HOT-WINGS
                                                   HOT-WINGS MIXED-FRUIT
                                                   SAMPLER-PLATE SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS MIXED-FRUIT
                                     MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS
                                                                 HOT-WINGS
                                                                 HOT-WINGS
                                                                 MIXED-FRUIT
                                                                 SAMPLER-PLATE
                                                                 SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS)
    changed from (MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (MIXED-FRUIT SAMPLER-PLATE
                                                   HOT-WINGS HOT-WINGS
                                                   MIXED-FRUIT MIXED-FRUIT
                                                   MIXED-FRUIT SAMPLER-PLATE
                                                   SAMPLER-PLATE SAMPLER-PLATE
                                                   SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS HOT-WINGS
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS HOT-WINGS
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS HOT-WINGS
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                           SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS HOT-WINGS
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (SAMPLER-PLATE) to (SAMPLER-PLATE HOT-WINGS HOT-WINGS
                                     MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                                     SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                                     SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT MIXED-FRUIT
                  MIXED-FRUIT SAMPLER-PLATE SAMPLER-PLATE SAMPLER-PLATE
                  SAMPLER-PLATE SAMPLER-PLATE) to (HOT-WINGS)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                     MIXED-FRUIT
                                                                     SAMPLER-PLATE)
    changed from (MIXED-FRUIT SAMPLER-PLATE) to (MIXED-FRUIT HOT-WINGS
                                                 SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                     SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                     SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                     SAMPLER-PLATE)
    changed from (HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                       HOT-WINGS
                                                                       HOT-WINGS
                                                                       MIXED-FRUIT
                                                                       SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                                 SAMPLER-PLATE)
    changed from (HOT-WINGS HOT-WINGS MIXED-FRUIT MIXED-FRUIT SAMPLER-PLATE) to (HOT-WINGS
                                                                                 SAMPLER-PLATE)
    (((:HOT-WINGS :HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :SAMPLER-PLATE) . 1505)
     ((:HOT-WINGS :MIXED-FRUIT :SAMPLER-PLATE) . 1505)
     ((:HOT-WINGS :HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
       :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE
       :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
       :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE
       :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE
       :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
       :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT
       :MIXED-FRUIT :MIXED-FRUIT :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE
       :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :HOT-WINGS :HOT-WINGS :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE
       :SAMPLER-PLATE)
      . 1505)
     ((:HOT-WINGS :HOT-WINGS :MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE
       :SAMPLER-PLATE)
      . 1505)
     ((:MIXED-FRUIT :SAMPLER-PLATE :SAMPLER-PLATE :SAMPLER-PLATE) . 1505))
    

    【讨论】:

    • 。我应该记得这一点,但我最近一直在使用具有功能 sorts 的语言。谢谢提醒。
    • 好吧,你实际上确实做得很好,只是使用来自sort的返回值(而不是什么比如(sort acc) (setf (gethash acc ) …)。问题只是其他地方还在使用它。它比许多排序是破坏性的”错误更微妙。
    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2011-04-18
    • 2018-05-29
    • 2012-11-30
    • 2011-03-08
    • 2011-02-24
    • 2011-04-09
    • 2016-12-03
    相关资源
    最近更新 更多