【发布时间】:2018-04-05 10:09:56
【问题描述】:
我尝试编写一个程序,用T 替换列表L 中元素A 的所有实例,用NIL 替换不同的元素。赌注是不要使用mapcar。
这是我之前所做的。我将所有T 和NIL 存储在一个新列表POS 中,然后返回POS。
(defun SRC (A L)
(defun _SRC (A L POS)
(COND ((NOT (EQUAL (CAR L) NIL))
(_SRC A (CDR L) (APPEND POS (LIST (EQUAL A (CAR L))))))
((EQUAL (CAR L) NIL)
(APPEND POS (LIST (EQUAL A NIL))))
(T POS)))
(CDR (_SRC A L (LIST NIL))))
当前行为:
该程序运行良好,除了搜索 NIL 本身时,但这里不关心这种特殊情况。
我的代码的几个示例运行:-
(SRC 'g '(a g g o t g))
> (nil t t nil nil t)
在列表中搜索NIL 时:-
(SRC nil '(t a t nil nil))
> (nil nil nil t)
在这种特殊情况下,我们的程序在找到列表中的第一个 NIL 时结束,对于其他搜索,程序可以正常工作。所以我尝试添加在列表列表中搜索的功能。
我在没有mapcar的列表列表中搜索的更新代码:
(defun SRC (A L)
(defun _SRC (A L POS)
(COND ((LISTP (CAR L))
(APPEND POS (LIST (SRC A (CAR L)))))
((NOT (EQUAL (CAR L) NIL))
(_SRC A (CDR L) (APPEND POS (LIST (EQUAL A (CAR L))))))
((EQUAL (CAR L) NIL)
(APPEND POS (LIST (EQUAL A NIL))))
(T POS)))
(CDR (_SRC A L (LIST NIL))))
现在,我期望从这段代码中得到的输出如下:
(SRC 'e '(a b e c (e g e) h t e))
> (nil nil t nil (t nil t) nil nil t)
相反,我的代码永远运行,导致堆栈溢出,而且我无法通过调用堆栈或回溯找出任何东西。
【问题讨论】:
标签: recursion common-lisp