有没有人可以帮助我用普通的 LISP 编写一个计算列表中数字的函数?我写的代码如下,但它不起作用!
(defun count-numbers(lst)
(let(result()))
(dolist(number lst)
(push number result))
(length result))
例如,当我输入这个查询时"(count'(r 4 f d w 2 3 4 1 z))"
,我必须得到 5。
有没有人可以帮助我用普通的 LISP 编写一个计算列表中数字的函数?我写的代码如下,但它不起作用!
(defun count-numbers(lst)
(let(result()))
(dolist(number lst)
(push number result))
(length result))
例如,当我输入这个查询时"(count'(r 4 f d w 2 3 4 1 z))"
,我必须得到 5。
既然是作业,我就给点指点。第一:简单。如果您是 Common-Lisp 的新手,请使用它的基本功能。例如:递归。纯粹的功能风格。想想这样的事情:
(defun count (list counter)
;; something
)
我们先检查清单。如果它是空的,我们已经检查了所有的元素,所以我们返回counter。如果列表不为空,我们
使用 (numberp n)。如果n是数字,则返回 T,否则返回 NIL。
(defun count-numbers (lst)
(let (result ()))
(dolist (number lst)
(push number result))
(length result))
检查压痕。那是你想要的吗?也许不吧。
然后你也将所有元素推送到结果列表中?那是你要的吗?
这是数字函数的列表。http://www.lispworks.com/documentation/HyperSpec/Body/c_number.htm 也许你需要一个?
这是一本很好的 Lisp 入门书籍,可供下载: http ://www.cs.cmu.edu/~dst/LispBook/
我想说有多种方法可以解决这个问题,一种是命令式循环,就像已经编写的最正确的解决方案一样,递归计数函数(这可能是最糟糕的方法,因为 CL 不能保证你会赢' t 破坏堆栈),或者您可能会在生产中实际使用的功能方法。最后一个是这样的:
(defun count-numbers (list) (count-if #'numberp list))