计算列表中的原子和列表

时间:2012-11-18 09:15:51

标签: functional-programming lisp common-lisp

我正在尝试编写一个函数来计算列表上层的原子数。例如,如果我有一个'(a b ((a) c) e),它应该返回3,这意味着上层有3个原子。

我还想创建一个计算列表中子列表数量的函数。第二个函数应该从每个级别上下计数。如果我们有'(a ((b) s)),如果子列表在上层,它应返回1,如果函数从上到下或列表的任何级别计数,则返回2。

下面的代码计算列表中的原子数,这是我不想要的。我该如何解决? 如何编写其他函数?

(defun count-atoms(L)
  (cond
    ((null l) 0)
    ((atom l) 1)
    (t (+ (count-atoms (car l))
          (count-atoms (cdr l))))))

如果我运行上述代码,请说

(count-atoms '(a b ((a) c) e))

它给了我5个。

1 个答案:

答案 0 :(得分:1)

您的代码以递归方式查看每个(car l),直到它是一个原子,因此每个项目都会被计算。

这应该有效:

(defun count-atoms(l)
  (cond
    ((null l) 0)
    (t (+ (cond
            ((atom (car l)) 1)
            (t 0))
          (count-atoms (cdr l))))))