誰能幫我這個程序在LISP:這段代碼的功能是什麼?
(defun callie(x y) (if x (callie (cdr x) y))
(if (= (mod (car x) y) 0) (format t "~a~%" (car x))))
我已經明白了功能和修復。這個程序做什麼?
誰能幫我這個程序在LISP:這段代碼的功能是什麼?
(defun callie(x y) (if x (callie (cdr x) y))
(if (= (mod (car x) y) 0) (format t "~a~%" (car x))))
我已經明白了功能和修復。這個程序做什麼?
貌似代碼試圖打印從列表中X的所有可能的值,其中值是準確的,整除Y.
它裏面有一些錯誤,但。
當試圖瞭解該程序,你應該通過固定格式開始:
(defun callie (x y)
(if x
(callie (cdr x) y))
(if (= (mod (car x) y) 0)
(format t "~a~%" (car x))))
而不when
秒的其他分支更換if
s和0與特定zerop
謂詞的比較,可以進一步澄清事情:
(defun callie (x y)
(when x
(callie (cdr x) y))
(when (zerop (mod (car x) y))
(format t "~a~%" (car x))))
預期的參數類型似乎是x的整數列表和y的整數。函數的目的似乎是打印y的倍數的x的所有元素。
一個問題似乎是函數遞歸直到x
爲空,然後嘗試檢查該版本的x
(顯然不存在)的第一個元素。所以,要解決這個問題,你必須確保函數不會嘗試進一步處理空列表。在我看來,最好的方法是利用標準函數或宏來處理副作用列表,如mapc
或dolist
。
在Common Lisp中編寫通常的方法是使用一個函數,它返回一個新的列表,其中所有的項目不會與給定的數字一起歸零。
通常這個測試是作爲一個謂詞函數寫的,它返回一個布爾值。這個功能然後被用來從列表中刪除不需要的項目。
請參閱REMOVE-IF和REMOVE-IF-NOT。
你的任務是獲得遞歸權。但是在真正的Lisp代碼中,遞歸不是直接使用的。
作業?如果是這樣,請將其標記爲。 – Marcin