gpt4 book ai didi

lisp - 为什么这个 Lisp 函数总是让我出现堆栈溢出?

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

这里的函数:

(defun test (a)
(if (equal a nil) 0)
(if (listp (car a)) (print "a")
(print "b"))
(test (cdr a))
)

如果 anil,我希望它返回 0,这是基本情况。然后如果列表前面的元素是一个列表,打印字母 a 否则打印 b 然后再次调用函数。为什么基本情况不能防止无限循环?

最佳答案

你的代码以堆栈溢出结束,因为你递归到 test 而不管 nil -check 的结果。

(defun test (a)
(if (equal a nil) 0) ; <-- problem is partly here...
(if (listp (car a))
(print "a")
(print "b"))
(test (cdr a))) ; <-- ...and partly down here

即使 (equal a nil) 的计算结果为 T 并且周围的 if 因此计算为 0,你基本上忽略了这个结果,因为下一步你要做的是检查 a 是否是一个列表,而不管之前的 nil 检查的结果。最终您再次调用 test 而没有考虑比较的结果。

请记住,Lisp 中函数的结果是最后计算的表达式的结果,这意味着如果您希望函数返回 0,则必须使 0 最后计算的表达式。

以下代码按照您指定的方式运行:

(defun test (a)
(if (null a)
0
(progn
(if (listp (car a))
(print "a")
(print "b"))
(test (cdr a)))))
  • 请注意,您可以使用 null 进行 nil 检查。
  • 如果a 不是nil,那么并且只有在那时,a 才会被进一步检查。为此,progn 允许您计算一系列表达式并最终计算出其最后一个表达式的结果。

关于lisp - 为什么这个 Lisp 函数总是让我出现堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21850666/

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