考虑以下BNF定义数字树。 请注意,树可以是叶子,具有一个子树的节点1或节点-2 有两个子树。
tree ::= (’leaf number)
| (’node-1 tree)
| (’node-2 tree tree)
一个。为这些树上的递归过程写一个模板。
湾定义返回的过程(leaf-count t) 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:期望类型对的参数;给叶子
此错误消息是什么意思?我将叶子定义为列表。但由于某种原因,它没有看到,并给我错误信息。
答案 0 :(得分:5)
确实解决其他人的任务很有趣。
(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))]))
答案 1 :(得分:2)
你引用了leaf (leaf-count '(leaf 5))
所以它是一个符号,而不是你之前定义的变量。这是错误的原因,但不是你应该解决的问题。您的三个定义没有多大意义,检测叶子或节点的过程与BNF规范不匹配。
以下是您自己的示例中的树:’(node-1 (node-2 (leaf 4) (node-2 (leaf 2) (leaf 3))))
。引用它是node-1
,node-2
和leaf
只是符号,无需定义。现在编写leaf?
和node?
函数,可以检测上面树的各种元素是什么。这是一个测试用例,其中所有函数调用都应返回true:
(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 :(得分:0)
这是我到目前为止所拥有的:
;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,因为这是包含信息的内容。在这种情况下,列表中的汽车只是数据的标签(叶子,节点等)。不完全的。我让它适用于最基本的测试用例,但不适用于像
这样的更复杂的测试用例(leaf-count '(node-2 (leaf 25) (leaf 17)))