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)))))
有人可以向我解釋這段代碼的作用和工作原理嗎?常見的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)))))
快速運行代碼顯示它是一個函數,它返回給定兩個數字或數字列表的最大數字。如果給出原子,它將返回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的條件]
至於它是如何工作的?該函數比較列表中的數字,第一個參數和數字,第二個參數並返回其中最大的數字。它通過遞歸地比較列表的前兩個數字來完成此操作,將列表中的較大數字與列表的其餘部分進行比較。
如果你不懂語言,你應該閱讀它,瞭解它的語法。這不是這類問題的地方 – gmoshkin
你在代碼中理解了什麼? – coredump
您可以使用['STEP'](http://clhs.lisp.se/Body/m_step.htm)或['TRACE'](http://clhs.lisp.se/Body/m_tracec.htm)看看一個函數是如何工作的。 – Barmar