首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归计数以数字开头的子列表

递归计数以数字开头的子列表
EN

Stack Overflow用户
提问于 2016-07-27 13:23:33
回答 2查看 265关注 0票数 1

我正试着用Lisp写代码,递归地计算以number开头的子列表。我一直在尝试使用numberp,但是当我的代码到达一个原子时,它不会计算列表的其余部分。

这里有我的代码,

代码语言:javascript
运行
复制
(defun nombres (liste) 
  (cond 
   ((atom liste) 0)((atom (car liste)) 0) 
   ((and (numberp (caar liste)) (+ (nombres (cdr liste)) 1)))
   (t (nombres (cdr liste))) ) )

我可以得到子列表的计数,但当到达一个原子时,它不会计算其余的。

代码语言:javascript
运行
复制
[67]> (nombres '((a b d) (5 g) (7 m)))
2
[68]> (nombres '((a b d) (5 g) g (7 m)))
1

当我用(listp (汽车列表))测试子列表时,它给我的结果为空。

代码语言:javascript
运行
复制
[69]> (defun nombres (liste) 
  (cond 
   ((atom liste) 0)((atom (car liste)) 0) 
   ((listp (car liste))(and (numberp (caar liste)) (+ (nombres (cdr liste)) 1)))     (t (nombres (cdr liste))) ) )
NOMBRES
[70]> (nombres '((a b d) (5 g) g (7 m) m))
NIL

我想要这样的东西:

代码语言:javascript
运行
复制
(nombres '((a b d) a (5 g) (b) (7 m) j (8 h l g))) 
3

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2016-07-27 14:09:48

你需要考虑你需要处理的案件。

在列表末尾=>

  1. =>
  2. 前面有一个数字的子列表向下一个元素添加1,否则继续到下一个元素=> =>

这些将非常容易地转换为COND

代码语言:javascript
运行
复制
(cond ((endp list) ...)            ; 1
      ((and (listp (car list))     ; 2
            (numberp (caar list)))
       ...)
      (t ...)                      ; 3

使用累加器作为可选参数,很容易填写计数:

代码语言:javascript
运行
复制
(defun count-sublists (list &optional (acc 0))
  (cond ((endp list) acc)
        ((and (listp (car list))
              (numberp (caar list)))
         (count-sublists (cdr list) (1+ acc)))
        (t (count-sublists (cdr list) acc))))

(count-sublists '((a b d) a (5 g) (b) (7 m) j (8 h l g)))
;=> 3
票数 2
EN

Stack Overflow用户

发布于 2016-07-27 17:27:44

标准的Common Lisp函数count-if更易于使用:

代码语言:javascript
运行
复制
CL-USER > (count-if (lambda (item)
                      (and (consp item)
                           (numberp (first item))))
                    '((a b d) a (5 g) (b) (7 m) j (8 h l g)))
3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38604335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档