有人可以向我解释这段代码的作用及其工作原理吗?
(defun f (&optional (x nil) (y (if (atom x) nil (car x))))
(cond ((atom x) y)
((< (car x) y) (f (cdr x) y))
(t (f (cdr x) (car x)))))
答案 0 :(得分:0)
快速浏览代码显示它是一个函数,它返回给定两个数字或数字列表的最大数字。如果给定一个原子,它将返回nil,如果列表中的一个元素不是数字,则返回错误。
以下是我得到的一些结果:
CL-USER> (f '(1 2 3 4))
4
CL-USER> (f '(1 5 2 4))
5
CL-USER> (f '(1 5 2 4 7))
7
CL-USER> (f 'y)
NIL
CL-USER> (f 3 'y)
Y
如果列表中存在非数字,则会出现类型错误:
CL-USER> (f '(1 x 2 4 7))
出现以下错误
价值
X
不是类型
数
绑定SB-KERNEL :: X时
[TYPE-ERROR类型的条件]
至于它是如何工作的?该函数比较列表中的数字,第一个参数和数字,第二个参数,并返回它们中最大的一个。它通过递归比较列表的前两个数字来执行此操作,返回与列表其余部分相比较大的数字。