1

有没有人可以帮助我用普通的 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。

4

3 回答 3

5

既然是作业,我就给点指点。第一:简单。如果您是 Common-Lisp 的新手,请使用它的基本功能。例如:递归。纯粹的功能风格。想想这样的事情:

(defun count (list counter) 
    ;; something
)

我们先检查清单。如果它是空的,我们已经检查了所有的元素,所以我们返回counter。如果列表不为空,我们

  1. 取它的第一个元素
  2. 我们检查它是否是一个数字
  3. 这是一个数字!我们在列表的其余部分递归调用count并且 counter = counter + 1
  4. 这不是一个数字!我们使用与以前相同的计数器递归调用列表其余部分的计数

使用 (numberp n)。如果n是数字,则返回 T,否则返回 NIL。

于 2012-07-16T18:19:24.837 回答
0
(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/

于 2012-07-16T18:11:20.170 回答
0

我想说有多种方法可以解决这个问题,一种是命令式循环,就像已经编写的最正确的解决方案一样,递归计数函数(这可能是最糟糕的方法,因为 CL 不能保证你会赢' t 破坏堆栈),或者您可能会在生产中实际使用的功能方法。最后一个是这样的:

(defun count-numbers (list) (count-if #'numberp list))
于 2012-07-17T03:22:35.770 回答