这段代码的功能是什么?
问题描述:
谁能帮我这个程序在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