【发布时间】:2010-02-08 17:23:14
【问题描述】:
考虑以下定义数字树的 BNF。 请注意,一棵树可以是叶子、具有一个子树的节点 1 或节点 2 有两个子树。
tree ::= (’leaf number)
| (’node-1 tree)
| (’node-2 tree tree)
一个。为这些树上的递归过程编写一个模板。
b.定义返回 t中的叶子数
> (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
这是我目前所拥有的:
;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))))))
看起来它应该运行得很好,但是当我尝试使用一个简单的测试用例来运行它时
(leaf-count '(leaf 5))
我收到以下错误消息:
car:需要类型对的参数;给定叶子
这个错误信息是什么意思?我将叶子定义为列表。但是由于某种原因,它没有看到它并给了我那个错误消息。
【问题讨论】:
-
当我读到你的问题时,我不知道如何回答,因为我不知道你知道该怎么做。您需要知道如何在方案中制作列表结构吗?你能做一个递归遍历列表的函数吗?太多未知数。
-
我有一些代码试图解决这个问题(见上文)。你能看看它并帮我解决它吗?
标签: scheme binary-tree racket