2011-12-12 133 views
-1

誰能幫我這個程序在LISP:這段代碼的功能是什麼?

(defun callie(x y) (if x (callie (cdr x) y)) 
    (if (= (mod (car x) y) 0) (format t "~a~%" (car x)))) 

我已經明白了功能和修復。這個程序做什麼?

+0

作業?如果是這樣,請將其標記爲。 – Marcin

回答

1

貌似代碼試圖打印從列表中X的所有可能的值,其中值是準確的,整除Y.

它裏面有一些錯誤,但。

3

當試圖瞭解該程序,你應該通過固定格式開始:

(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(顯然不存在)的第一個元素。所以,要解決這個問題,你必須確保函數不會嘗試進一步處理空列表。在我看來,最好的方法是利用標準函數或宏來處理副作用列表,如mapcdolist

1

在Common Lisp中編寫通常的方法是使用一個函數,它返回一個新的列表,其中所有的項目不會與給定的數字一起歸零。

通常這個測試是作爲一個謂詞函數寫的,它返回一個布爾值。這個功能然後被用來從列表中刪除不需要的項目。

請參閱REMOVE-IF和REMOVE-IF-NOT。

你的任務是獲得遞歸權。但是在真正的Lisp代碼中,遞歸不是直接使用的。