2015-04-18 127 views
-1

我一直在使用常见的LISP进行数周的调试,主要尝试练习递归。我想要做的是有一个函数常见的LISP函数,用于删除列表中每个子列表的第n个位置上的元素

(defun rem (n l) 
    ; code here 
) 

,其中n为总是一个非负整数,λ可以是原子/列表/空。该函数删除的第n个元素(一个基于索引):

  • 列表(L)本身

  • 任何级别的子列表的原始列表包含

我估计使用删除第n会使这项任务小菜一碟,但我还没有取得任何成功。

任何答案/实际代码将不胜感激。谢谢!

回答

1

你没有说如果你想要remove功能或delete功能。我会在这里做非破坏性的版本。

您可以制作一个列表的remove-nth,方法是在索引之前创建所有元素的新列表,然后使用要删除的cons的尾部以共享尽可能多的结构。这是一个使用subseq,nconcnthcdr的实现来展示它是多么容易,没有递归。

(defun remove-nth (n list) 
    (nconc (subseq list 0 n) (nthcdr (1+ n) list))) 

(defparameter *test* (list 0 1 2 3 4 5 6)) 
(remove-nth 3 *test*) ; ==> (0 1 2 4 5 6) 
(remove-nth 0 *test*) ; ==> (1 2 3 4 5 6) 

递归函数会是这个样子:

(defun remove-nth-rec (n list) 
    (assert (not (null list))) 
    (if (zerop <??>) 
     <??> 
     (cons <??> (remove-nth-rec <??> <??>)))) 

可以使功能,这是否对每个子表递归了。我会用mapcar做到这一点:

(defun remove-all-nth (n lol) 
    (mapcar (lambda (x) (remove-nth n x)) lol)) 

(remove-all-nth 0 '((a b c) (0 1 2) (I II III))) ; ==> ((b c) (1 2) (II III)) 

递归函数会是这个样子:

(defun remove-all-nth-rec (n list) 
    (if (null <??>) 
     nil 
     (cons (remove-nth-rec n <??>) 
      (remove-all-nth-rec n <??>)))) 
相关问题