Lisp列表迭代
我有一个函数,它获取x(一个值)和xs(一个列表),并从列表中删除所有大于x的值。嗯,它不起作用,你能告诉我为什么吗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的第一个参数是位
(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))