Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp列表迭代_Lisp_List_Iteration - Fatal编程技术网

Lisp列表迭代

Lisp列表迭代,lisp,list,iteration,Lisp,List,Iteration,我有一个函数,它获取x(一个值)和xs(一个列表),并从列表中删除所有大于x的值。嗯,它不起作用,你能告诉我为什么吗 (defun biggerElems(x xs) (let ((xst)) (dolist (elem xs) (if (> x elem) (setf xst (remove elem xs)))) xst)) 我认为这句话不对: (setf xst (remove elem xs)))) setf的第一个参数是位

我有一个函数,它获取x(一个值)和xs(一个列表),并从列表中删除所有大于x的值。嗯,它不起作用,你能告诉我为什么吗

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

我认为这句话不对:

(setf xst (remove elem xs))))
setf
的第一个参数是位置,后面是值。它看起来是向后的(并且
xst
不是
nil就是未初始化)

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

(defun biggerElems (x xs)
  (remove-if (lambda (item) (> item x)) xs))
它是这样工作的:

(defun filterBig (x xs)
  (remove-if (lambda (item) (> item x)) xs))
“#”是干什么的?它没有用它编译

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


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

如果您想用Lisp方式执行此操作,可以使用递归返回新列表:

(defun biggerElems (x xs)
  (cond ((null xs) NIL)
        ((< x (car xs))
         (biggerElems x (cdr xs)))
       (t
        (cons (car xs) (biggerElems x (cdr xs))))))
(定义biggerElems(x xs)
(cond((null xs)NIL)
((
@卢伊斯奥利维拉

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

最简洁的AFAIK:

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

(defun biger elements(x xs)(remove x xs:test#)“@Ben:错误的不是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))
(defun biger elems(x xs);我更喜欢用连字符分隔,而不是用camelCase…而不是各自独立

(xs-when中元素的循环)(仅仅因为可以在Lisp中使用递归,并不意味着它是“Lisp方式”。在Lisp中有几种实现这一点的机制(如本文其他地方所示),它们都是惯用的。递归方法只是最原始的方法。
(defun biggerElems(x xs)
  (let ((xst xs))
    (dolist (elem xs)
      (when (> x elem)
        (setf xst (remove elem xst))))
    xst))
(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))