我正在尝试编写一个函数来计算列表上层的原子数。例如,如果我有一个'(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个。
答案 0 :(得分:1)
您的代码以递归方式查看每个(car l)
,直到它是一个原子,因此每个项目都会被计算。
这应该有效:
(defun count-atoms(l)
(cond
((null l) 0)
(t (+ (cond
((atom (car l)) 1)
(t 0))
(count-atoms (cdr l))))))