2017-02-07 86 views
1

我正在做一些球拍练习,其中一个练习要求创建一个名为“count-trees”的函数,它将计算ListTree中的所有元素。中的说明,一个ListTree是具有以下定义(一个或多个)的递归数据结构:如何计算球拍中列表树中的元素数量?

- 它可以是一个整数

- 它可以是一个列表或子列表的列表

-per说明,我们假定一个清单树不能为空

这里有一个什么样的名单树看起来像一个例子:

(list 1 2) 

(list (list 1) 
     2 
     (list 1 4 5)) 

(list 1 
     (list 2 1) 
     1 
     1) 

现在,这里是WH在我的代码如下所示:

(define count-tree (lambda (lst) 
        (if (empty? lst) 
         0 
         (length (lst))))) 

当我执行的功能,它的工作原理,但只有当有一个列表,而不是在包含子列表清单。它似乎只计算有多少个列表,但我希望它列出列表中的所有元素。有没有办法去解决这个问题?谢谢!

回答

1

长度可以实现这样的:

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

而且这样的:

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

由于列表中有两个元素。它并不妨碍这两个元素是两个也包含元素并且你的函数需要这样做的列表。因此你的功能需要做一件比length更多的事情。您需要对carcdr的递归进行求和,以便在car中有一对,否则与length相同。

还有更多巧妙版本的length,但我想你会在稍后了解到。