2017-06-06 43 views
0

有人可以向我解释这段代码的作用和工作原理吗?常见的LISP代码说明

(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))))) 
+2

如果你不懂语言,你应该阅读它,了解它的语法。这不是这类问题的地方 – gmoshkin

+0

你在代码中理解了什么? – coredump

+0

您可以使用['STEP'](http://clhs.lisp.se/Body/m_step.htm)或['TRACE'](http://clhs.lisp.se/Body/m_tracec.htm)看看一个函数是如何工作的。 – Barmar

回答

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 A型错误出现时,有列表中的一个非数字: CL-USER> (f '(1 x 2 4 7)) 提供了以下错误 值 X 的类型是 NUMBER不 当绑定SB-KERNEL :: X [类型TYPE-ERROR的条件]

至于它是如何工作的?该函数比较列表中的数字,第一个参数和数字,第二个参数并返回其中最大的数字。它通过递归地比较列表的前两个数字来完成此操作,将列表中的较大数字与列表的其余部分进行比较。