【发布时间】:2016-08-19 20:14:07
【问题描述】:
我在 Dr. Racket 中使用 Simply Scheme。
问题是编写树映射,类似于深度映射,但对于树,使用基准和子选择器。这是深度地图:
(define (deep-map f structure)
(cond ((word? structure) (f structure))
((null? structure) '())
(else (cons (deep–map f (car structure))
(deep–map f (cdr structure))))))
到目前为止,这是我对树图的尝试:
(define (tree-map f structure)
(cond ((leaf? structure)
(f (datum structure)))
(else
(cons (tree-map f (car (children structure)))
(tree-map f (cdr (children structure)))))))
这些是树的构造函数和选择器:
(define (make-node datum children)
(cons datum children))
(define (datum node)
(car node))
(define (children node)
(cdr node))
(define (leaf datum)
(make-node datum '()))
(define (leaf? node)
(null? (children node)))
对于我的测试用例,我将这个数字树与一个函数一起使用,例如 square:
(define number-tree
(make-node
'56
(list (make-node
'2
(children '(34 25 7 89)))
(make-node
'32
(list (make-node
'27
(children '(13 55 80)))
(make-node
'1098
(children '(45 785 98)))
(make-node '123 (children '(9046)))))
(make-node '23 (children '(1 9)))
(make-node '867
(children '(1 3 5 78)))
(make-node
'0
(list
(make-node '78 (children '(984)))
(make-node '45
(children '(23 46 78467)))
(make-node '3 (children '(2))))))))
我收到的错误消息是“cdr,违反合同,预期对”之类的。到目前为止,我在使用 Scheme 中的列表时没有遇到太多问题——我似乎明白了。但是翻译成树给我带来了一个问题——原则上我没有得到一些东西,这意味着我不断收到这些与列表相关的关于树问题的错误消息。我试图继续使用抽象类型(树和节点)而不考虑列表。 我是否以正确的方式解决这个问题?非常感谢任何有助于理解我在与树木一起工作方面所缺少的东西。
【问题讨论】: