gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:22 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com