如何计算Racket中列表树中的元素数量?

时间:2017-02-07 21:12:24

标签: sql racket

我正在进行一些球拍练习,其中一个练习要求创建一个名为“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)))))

当我执行该函数时,它只能在有一个列表时工作,而不是在包含子列表的列表上。它似乎只计算有多少列表,但我希望它计算列表中的所有元素。有办法解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:1)

长度可以像这样实现:

(define length 
  (lambda (lst)
    (if (empty? lst)
        0
        (+ 1 (length (cdr lst))))))

因此:

(length '((1 2) (3 4))) 
; ==> 2

由于列表有两个元素。它并不困扰它们两个元素是两个也有元素的列表,你的功能需要这样做。因此,您的功能需要比length做更多的事情。如果您在car中有一对,则需要对cdrcar的递归求和,否则与length相同。

length还有更多聪明的版本,但我想你以后会了解到这一点。