我正在进行一些球拍练习,其中一个练习要求创建一个名为“count-trees”的函数,它将计算ListTree中的所有元素。根据指令,ListTree是一个递归数据结构,具有以下定义:
- 可以是整数
- 可以是列表或包含子列表的列表
- 按照说明,我们假设列表树永远不会为空
以下是列表树的几个示例:
(list 1 2)
(list (list 1)
2
(list 1 4 5))
(list 1
(list 2 1)
1
1)
现在,这是我的代码:
(define count-tree (lambda (lst)
(if (empty? lst)
0
(length (lst)))))
当我执行该函数时,它只能在有一个列表时工作,而不是在包含子列表的列表上。它似乎只计算有多少列表,但我希望它计算列表中的所有元素。有办法解决这个问题吗?谢谢!
答案 0 :(得分:1)
长度可以像这样实现:
(define length
(lambda (lst)
(if (empty? lst)
0
(+ 1 (length (cdr lst))))))
因此:
(length '((1 2) (3 4)))
; ==> 2
由于列表有两个元素。它并不困扰它们两个元素是两个也有元素的列表,你的功能需要这样做。因此,您的功能需要比length
做更多的事情。如果您在car
中有一对,则需要对cdr
和car
的递归求和,否则与length
相同。
length
还有更多聪明的版本,但我想你以后会了解到这一点。