我想遍历一个列表(可能有嵌套列表)并将其计算为一个包含所有元素的扁平化列表。我什至无法获得递归函数来评估除 nil
以外的任何值
(defun pl(lst)
(if (atom lst)
lst
(progn
(pl (car lst))
(pl (cdr lst)))))
然后我会调用类似 (pl '(1 (2 3) (4 5)))
的东西, 但它总是评估为 nil
.
我变了
(if (atom lst) lst
到
(if (atom lst) (print lst)
这甚至不会打印列表中的任何项目。
我在这里缺少什么概念?
最佳答案
一个函数通常只会返回一个值,即函数体的值。如果仔细查看 pl
,您会发现它是一个 if
形式,因此 pl
要么返回 lst
或 progn
的值。
我在这里首先要指出的是,(progn ...)
形式的返回值是其最后一个表达式的值,在本例中是递归调用 (pl (cdr lst))
。由于您未对 (pl (car lst))
的返回值执行任何操作,因此此调用没有任何效果。递归调用的值将在某个时刻通过 atom
测试。这里要指出的第二件事是 (atom nil)
也是如此。请记住,列表的最后一个元素是 nil
,因此当您给 pl
一个列表时,它会总是返回 nil,正如您观察到的那样。
如果您的打印版本什么也没显示,可能是因为打印输出显示在其他地方,例如另一个缓冲区。
至于解决方案:您要么想要使用 append
而不是 progn
的纯递归解决方案,因为这就是您的家庭作业。在常规 lisp 中,您只需使用其中一种迭代结构。
我的建议是查看任何有关 lisp 或 scheme 的教科书,以掌握递归和尾递归的基础知识。
关于list - 只是试图递归地打印一个列表,但没有打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6494113/