2011-12-12 134 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代码中,递归不是直接使用的。