2017-06-06 10 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

コードをすばやく実行すると、2つの数字または数字のリストを指定した最大の数字を返す関数が表示されます。アトムを指定するとnilを返し、リストの要素の1つが数値でない場合はエラーを返します。ここ 私が得た結果の一部を以下に示します。 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 のタイプが NUMBERではありません、次のエラー に値を与える バインディング時にSB-KERNEL :: X [TYPE-ERRORタイプの条件]

どのように動作しますか?この関数は、リスト内の数値、最初のパラメータ、および2番目のパラメータを比較し、そのうちの最大値を返します。それはリストの最初の2つの数字を再帰的に比較して、それを比較して大きい数字をリストの残りの部分に戻します。

関連する問題