首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案中的二叉树

方案中的二叉树
EN

Stack Overflow用户
提问于 2010-02-08 17:23:14
回答 3查看 10.1K关注 0票数 3

考虑下面定义数字树的BNF。请注意,树可以是叶,节点-1有一个子树,或者节点-2有两个子树。

代码语言:javascript
复制
tree ::= (’leaf number)
| (’node-1 tree)
| (’node-2 tree tree)

为这些树上的递归过程编写一个模板。

定义返回t中叶数的过程(叶数t)。

代码语言:javascript
复制
> (leaf-count ’(leaf 5))

1

> (leaf-count ’(node-2 (leaf 25) (leaf 17)))

2

> (leaf-count ’(node-1
(node-2 (leaf 4)
(node-2 (leaf 2) (leaf 3)))))

3

到目前为止,我的情况如下:

代码语言:javascript
复制
;define what a leaf, node-1, and node-2 is
(define leaf list)
(define node-1 list)
(define node-2 list)

;procedure to decide if a list is a leaf or a node
(define (leaf? tree) (number? (car tree)))
(define (node? tree) (pair? (car tree)))

(define (leaf-count tree)
 (cond ((null? tree) 0)
        ((number? tree) 0)
        ((leaf? tree) 1)
        (else (+ (leaf-count (car tree))
                 (leaf-count (cdr tree))))))

它看起来应该运行得很好,但是当我尝试使用一个简单的测试用例运行它时,比如

代码语言:javascript
复制
(leaf-count '(leaf 5))

我收到以下错误消息:

car:期望类型对的参数;给定的叶

这个错误信息意味着什么?我把叶子定义为一张清单。但出于某种原因,它没有看到这一点,并给出了错误信息。

EN

回答 3

Stack Overflow用户

发布于 2010-02-08 19:34:12

解决别人的任务确实很有趣。

代码语言:javascript
复制
(define leaf-count
  (match-lambda 
   [(list 'leaf x)     1]
   [(list 'node-1 t)   (leaf-count t)]
   [(list 'node-2 l r) (+ (leaf-count l) (leaf-count r))]))
票数 5
EN

Stack Overflow用户

发布于 2010-02-10 03:26:25

你引用了叶子,(leaf-count '(leaf 5)),所以它是一个符号,而不是你之前定义的变量。这是错误的原因,但不是你应该修复的东西。您的三个定义没有多大意义,您检测叶子或节点的过程不符合BNF规范。

下面是您自己的示例中的一棵树:’(node-1 (node-2 (leaf 4) (node-2 (leaf 2) (leaf 3))))。它被引用,所以node-1node-2leaf只是符号,不需要定义。现在编写leaf?node?函数,这些函数可以检测出上面树的各种元素。下面是一个测试用例,所有函数调用都应该返回true:

代码语言:javascript
复制
(define a-tree ’(node-1 (node-2 (leaf 4) (node-2 (leaf 2) (leaf 3)))))
(node? a-tree)
(node? (car (cdr a-tree)))
(leaf? (car (cdr (car (cdr a-tree)))))
(node? (car (cdr (cdr (car (cdr a-tree))))))
(leaf? (car (cdr (car (cdr (cdr (car (cdr a-tree))))))))

一旦成功,计数也没有问题(尽管你目前的方法不能工作,我建议写左子树和右子树函数来帮助你)。

票数 2
EN

Stack Overflow用户

发布于 2010-02-10 00:06:23

到目前为止,我的情况如下:

代码语言:javascript
复制
 ;define what a leaf, node-1, and node-2 is
(define leaf list)
(define node-1 list)
(define node-2 list)

;procedure to decide if a list is a leaf or a node
(define (leaf? tree) (number? (cadr tree)))
(define (node? tree) (pair? (cadr tree)))

(define (leaf-count tree)
 (cond ((null? tree) 0)
        ((number? tree) 0)
        ((leaf? tree) 1)
        (else (+ (leaf-count (car tree))
                 (leaf-count (cdr tree))))))

我做了一个小的调整:更改条件以检查列表的cadr,因为这是包含信息的内容。在本例中,列表中的car只是数据(叶、节点等)的标签。不完全是。我把它用于最基本的测试用例,但不适用于更复杂的测试用例,例如

代码语言:javascript
复制
(leaf-count '(node-2 (leaf 25) (leaf 17)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2223472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档