(cons 2 (cons ( cons 2 3 ) (cons 4 5 )))
这给了我一个看起来像这样的列表:(2 (2 . 3) 4 . 5)
当我尝试计算这个列表中的元素数量时,输出是3
预期的。
如何计算一对中单个元素的数量?在这种情况下的输出应该是5
例如。
这是一个可能的解决方案,问题本质上是询问列表结构中的原子数(不一定是空终止的正确列表):
(define (count-all seq)
(cond ((null? seq) 0)
((not (pair? seq)) 1)
(else (+ (count-all (car seq))
(count-all (cdr seq))))))
它适用于这样的元素序列:
car
和的元素cdr
对于任意嵌套的列表结构,它可以按预期工作:
(count-all '(2 (2 . 3) 4 . 5))
=> 5
(count-all '(1 (2 . (3 (4 . 5) 6)) 7 . 8))
=> 8
对于任意深度嵌套的列表,我们可以递归地解决这个问题。
(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
编辑: 这是奥斯卡答案的重复。当我点击提交时,我没有看到他已经回答了,但是我觉得这些评论很有用,所以我会把它留在这里。