Scheme 方案中的二叉树

Scheme 方案中的二叉树,scheme,binary-tree,racket,Scheme,Binary Tree,Racket,考虑以下定义数字树的BNF。 请注意,树可以是叶、带有一个子树的节点1或节点2 有两个子树 tree ::= (’leaf number) | (’node-1 tree) | (’node-2 tree tree) a。为这些树上的递归过程编写模板 b。定义返回 t中的叶数 > (leaf-count ’(leaf 5)) 1 > (leaf-count ’(node-2 (leaf 25) (leaf 17))) 2 > (leaf-count ’(node-1

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

tree ::= (’leaf number)
| (’node-1 tree)
| (’node-2 tree tree)
a。为这些树上的递归过程编写模板

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))))))
 ;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))))))
看起来它应该运行得很好,但是当我尝试使用一个简单的测试用例来运行它时,比如

(leaf-count '(leaf 5))
我收到以下错误消息:

car:类型为pair的参数;给定叶


这个错误消息是什么意思?我将叶子定义为列表。但出于某种原因,它没有看到这一点,并给了我错误信息。

解决别人的作业确实很有趣

(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))]))

以下是我目前掌握的情况:

;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))))))
 ;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只是数据的标签(叶、节点等)。不完全是。我让它适用于最基本的测试用例,但不适用于像这样更复杂的测试用例

(leaf-count '(node-2 (leaf 25) (leaf 17)))
您引用了leaf,
(leaf count'(leaf 5))
,因此它是一个符号,而不是您前面定义的变量。这是错误的原因,但不是您应该修复的问题。您的三个定义没有多大意义,您检测叶或节点的过程与BNF规范不匹配

下面是您自己示例中的一个树:
”(节点1(节点2(叶4)(节点2(叶2)(叶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))))))))

一旦这样做了,计数也应该没有问题(尽管您当前的方法不起作用,但我建议编写左子树和右子树函数来帮助您实现这一点)。

谢谢您的回复,但我无法让它运行。我收到错误消息“引用未定义的标识符:匹配lambda”。你能解释一下“匹配lambda”的功能吗?你使用的是哪种语言级别<代码>匹配lambda是“scheme”语言的一部分,因此您应该在DrScheme定义窗口的顶部设置
#lang scheme
。您可以在PLT方案指南()中阅读更多关于
match lambda
。顺便说一句,我使用的语言是基于《编程语言要点》一书的课程所需的教学语言当我读到你的问题时,我不知道如何回答,因为我不知道你知道怎么做。您需要知道如何在scheme中创建列表结构吗?你能做一个递归遍历列表的函数吗?我有一些代码试图解决这个问题(见上文)。你能看一下并帮我修改一下吗?顺便说一句,我使用的语言是本课程所需的教学语言,基于Friedman和Wand的《编程语言要点》第三版。这可以修改示例,但不会更普遍地起作用。最基本的问题是,您的程序假设树是单向生成的,而您的测试程序则以不同的方式生成树。试着跑(第5页),然后跑(第5页),看看有什么不同。测试由讲师提供。我必须让它接受这一点作为输入。