递归地将列表附加到列表中元素的前面

时间:2015-12-01 21:28:46

标签: list recursion lisp common-lisp acl2

使用acl2,我试图创建一个函数,“ins”以递归方式将第一个参数(列表)附加到第二个参数(另一个列表)中每个元素的前面,其中

(ins (something) ( (a b c) (d e f) ...))

返回

( (something a b c) (something d e f) ...)

所以这样调用函数

(ins '((one thing)) '( ((this is)) ((something else)) ))

会给我们

'( ((one thing) (this is)) ((one thing) (something else)) ))

我提出了非递归函数,它只适用于包含单个元素的arg2列表,检查是否为空。

(defun ins(arg1 arg2)

  (if (equal arg2 nil) '() (list(append  arg1 (first arg2))))

)

当我尝试提出一些递归的东西时,它将第一个参数附加到第二个参数列表中的所有元素,我能做的最好就是

(defun ins (arg1 arg2)

  (cond

   ((equal arg2 nil) '())

   ((not(equal arg2 nil)) (ins (list(append  arg1 (first arg2))) (first(rest arg2)))

   )))

但无论如何,我总是得到一个零,我似乎无法弄明白为什么。因此,我甚至不知道我的递归调用是否正确。我只是很难追踪非平凡的递归。

1 个答案:

答案 0 :(得分:2)

这样的东西?

(defun ins (arg1 arg2)
  (if arg2
      (cons (append arg1 (car arg2)) 
            (ins arg1 (cdr arg2)))
      '()))