LISP - 每次出现搜索原子后的原子

时间:2018-01-07 04:59:11

标签: lisp elisp

我试图在列表中的搜索原子之后添加一个新原子。

当我尝试递归调用函数appendConst时,我收到以下错误 -

[1]> (defun appendConst (OLD NEW L)
       (cond
         ((null L) ())
         ((EQ (car L) OLD) (appendConst (cons OLD (cons NEW (cdr L))))  )
         (T (cons (car L) (appendConst OLD NEW (cdr L))))
    ))
APPENDCONST
[2]> (appendConst 'a 'd '(a c d e a m k))

*** - EVAL/APPLY: Too few arguments (1 instead of at least 3) given to APPENDCONST
The following restarts are available:
ABORT          :R1      Abort main loop
Break 1 [3]> 

在这里,使用我的输入,在每次出现'a'之后,我想在给定的整个列表中添加'd'。

我是新手,如何在这里递归调用函数?

TIA。

1 个答案:

答案 0 :(得分:1)

你的第一个递归调用(你添加NEW)确实只有一个错误所说的参数。只添加丢失的OLDNEW将无效,因为递归调用会再次找到OLD。所以,就像在你的另一个案例中一样,在电话会议之外进行处理:

(cons OLD (cons NEW (appendConst OLD NEW (cdr L))))

请注意,这两种情况都不是尾递归的:要避免堆栈使用与列表长度成比例,您必须修改列表或执行更复杂的操作,例如传递新列表的头部和尾部在递归时。