计算列表中的数字

时间:2012-07-16 17:29:42

标签: lisp common-lisp

是否有人可以帮助我在共同的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。

3 个答案:

答案 0 :(得分:5)

既然是家庭作业,我只想指点一下。第一:简单。如果您是Common-Lisp的新手,只需使用其基本功能即可。例如:递归。纯粹的功能风格。想想这样的事情:

(defun count (list counter) 
    ;; something
)

我们首先检查列表。如果它是空的,我们已经检查了所有元素,所以我们返回计数器。如果 list 不为空,我们

  1. 采取第一个元素
  2. 我们检查它是否是数字
  3. 这是一个数字!我们递归地在列表的其余部分调用 count 并使用counter = counter + 1
  4. 这不是一个数字!我们使用与以前相同的计数器以递归方式在列表的其余部分调用 count
  5. 使用(numberp n)。如果 n 是数字,则返回T,否则返回NIL。

答案 1 :(得分: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/

答案 2 :(得分:0)

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

(defun count-numbers (list) (count-if #'numberp list))