代码之家  ›  专栏  ›  技术社区  ›  Alexander Stolz

Lisp列表迭代

  •  4
  • Alexander Stolz  · 技术社区  · 16 年前

    (defun biggerElems(x xs) 
      (let ((xst))
        (dolist (elem xs)
          (if (> x elem)
              (setf xst (remove elem xs))))
        xst))
    
    6 回复  |  直到 16 年前
        1
  •  5
  •   Ben Collins    16 年前

    我认为这句话不对:

    (setf xst (remove elem xs))))
    

    第一个论点 setf 是位置,后跟值。看起来你把它倒过来了 xst nil 或未初始化)。

    您可能会发现这样做更容易:

    (defun biggerElems (x xs)
      (remove-if (lambda (item) (> item x)) xs))
    
        2
  •  4
  •   Bart    16 年前

    (defun bigger-elements (x xs) (remove x xs :test #'<))
    

    返回一个新的列表,它将从xs中删除所有元素y

    (< y x)
    

    或者使用著名的循环:

    (defun bigger-elements-2 (x xs) 
      (loop for e in xs
            unless (< e x)
            collect e))
    
        3
  •  1
  •   Alexander Stolz    16 年前

    (defun filterBig (x xs)
      (remove-if (lambda (item) (> item x)) xs))
    

    “#”是干什么的?它没有用它编译。

        4
  •  1
  •   Kyle Cronin    16 年前

    (defun biggerElems (x xs)
      (cond ((null xs) NIL)
            ((< x (car xs))
             (biggerElems x (cdr xs)))
           (t
            (cons (car xs) (biggerElems x (cdr xs))))))
    

    @奥利维拉酒店

    此解决方案与问题中发布的解决方案形成对比。如果我们需要做一些稍微复杂一点的事情,那么以递归方法来处理列表是很重要的。

        5
  •  1
  •   Morikal    16 年前

    @本:错误的不是setf调用——问题是他没有更新xs。

    ie:xst被设置为xs,元素被删除,但是xs没有被更新。如果要删除第二个元素,xst会将第一个元素放回其中。

    您需要将xst绑定到xs,并用xst替换remove调用中的xs。这将删除x大于的所有元素。即:

    (defun biggerElems(x xs)
      (let ((xst xs))
        (dolist (elem xs)
          (when (> x elem)
            (setf xst (remove elem xst))))
        xst))
    

    将xst设置为(复制列表xs),然后使用delete而不是remove可能会稍微快一点(delete是破坏性的…取决于您的实现,它可能会比remove快。由于您多次调用该函数,因此您可以获得更好的性能,即复制一次列表并从中进行破坏性删除)。

    (defun bigger-elems (x xs) ; I prefer hyphen separated to camelCase... to each his own
      (loop for elem in xs when (<= x elem) collect elem))
    

    回顾你原来的帖子,有点让人困惑。。。您说您删除了所有大于x的元素,但您的代码看起来似乎试图删除所有大于x的元素。我编写的解决方案返回的所有元素都大于x(即:删除所有元素x大于)。

        6
  •  0
  •   Ben Collins    16 年前

    “#”是干什么的?没有

    打字错误通常,您使用 #' (remove-if #'oddp list) ),但在编辑时,我忘了删除“#”。