1
(cons 2 (cons ( cons 2 3 ) (cons 4 5 )))

这给了我一个看起来像这样的列表:(2 (2 . 3) 4 . 5)当我尝试计算这个列表中的元素数量时,输出是3预期的。

如何计算一对中单个元素的数量?在这种情况下的输出应该是5例如。

4

2 回答 2

1

这是一个可能的解决方案,问题本质上是询问列表结构中的原子数(不一定是空终止的正确列表):

(define (count-all seq)
  (cond ((null? seq) 0)
        ((not (pair? seq)) 1)
        (else (+ (count-all (car seq))
                 (count-all (cdr seq))))))

它适用于这样的元素序列:

  • 如果序列为空,则它有零个元素
  • 如果序列不是一个 cons 单元(一对元素),那是因为它是一个元素 - 一个原子
  • 否则添加序列的car和的元素cdr

对于任意嵌套的列表结构,它可以按预期工作:

(count-all '(2 (2 . 3) 4 . 5))
=> 5

(count-all '(1 (2 . (3 (4 . 5) 6)) 7 . 8))
=> 8
于 2013-01-14T20:10:36.100 回答
0

对于任意深度嵌套的列表,我们可以递归地解决这个问题。

(define (atom? x) (not (pair? x)))

(define (count-atoms lst)
    (cond ((null? lst) 0) ; nothing to count, return 0
          ((atom? lst) 1) ; lst contains only one thing, return 1
          (else           ; otherwise, lst contains multiple elements
             (+ (count-atoms (car lst))       ; add the number of atoms in the first position
                (count-atoms (cdr lst))))))   ; to the number of atoms in the rest of the list

编辑: 这是奥斯卡答案的重复。当我点击提交时,我没有看到他已经回答了,但是我觉得这些评论很有用,所以我会把它留在这里。

于 2013-01-14T20:24:19.197 回答