任何人都可以帮助我在LISP中使用这个程序:
(defun callie(x y) (if x (callie (cdr x) y))
(if (= (mod (car x) y) 0) (format t "~a~%" (car x))))
我必须了解功能并进行修复。这个程序做了什么?
答案 0 :(得分:3)
在尝试理解该程序时,您应该首先修复格式:
(defun callie (x y)
(if x
(callie (cdr x) y))
(if (= (mod (car x) y) 0)
(format t "~a~%" (car x))))
使用if
替换没有else分支的when
,以及使用特定zerop
谓词与0进行比较,可以进一步澄清:
(defun callie (x y)
(when x
(callie (cdr x) y))
(when (zerop (mod (car x) y))
(format t "~a~%" (car x))))
预期的参数类型似乎是x的整数列表,y的整数。该函数的目的似乎是打印x的倍数的所有x元素。
问题似乎是函数在x
为空之前递归,然后尝试检查该版本x
的第一个元素(显然不存在)。因此,要解决此问题,您必须确保该函数不会尝试进一步处理空列表。在我看来,更好的方法是利用标准函数或宏来处理副作用列表,例如mapc
或dolist
。
答案 1 :(得分:1)
看起来代码试图从列表X中打印所有可能的值,其中值可以被Y整除。
但它有一些错误。
答案 2 :(得分:1)
在Common Lisp中编写它的通常方法是使用一个返回一个新列表的函数,其中所有项目都不会被给定的数字除以零。
通常,此测试被编写为返回布尔值的谓词函数。然后,此功能用于从列表中删除不需要的项目。
参见REMOVE-IF和REMOVE-IF-NOT。
你的任务是让递归正确。但是在真正的Lisp代码中,递归不是直接使用的。