list - 只是试图递归地打印一个列表,但没有打印

标签 list recursion printing lisp

我想遍历一个列表(可能有嵌套列表)并将其计算为一个包含所有元素的扁平化列表。我什至无法获得递归函数来评估除 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 要么返回 lstprogn 的值。

我在这里首先要指出的是,(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/

相关文章:

C# 将数组或列表添加到列表中

python - 如何比较两个列表中一个列表中有重复的项目?

python - 根据项目列表中元素的顺序从键列表和项目列表创建字典

python - 递归就差不多了。最后一件事

java - 在同一行打印输出

python - 从列表中的每个键获取具有最大值的元组

recursion - SICP - 递归或迭代过程?

algorithm - 每个递归算法都可以用动态规划改进吗?

javascript - 如何使用 React/JS 连接到斑马打印机

javascript - 打印包含文本区域的 div。用户使用js输入