我正在尝试以 Map 的形式将函数应用于树,但不确定如何具体执行。这是我的尝试..
(define-struct node (value left middle right)#:transparent)
(struct emptyNode () #:transparent) ; leaf node
(define T (node 1 (node 2 (node 5 (emptyNode) (emptyNode) (emptyNode)) (emptyNode) (emptyNode))
(node 3 (emptyNode) (node 6 (emptyNode) (node 8 (emptyNode) (emptyNode) (emptyNode)) (emptyNode)) (emptyNode))
(node 4 (emptyNode) (emptyNode) (node 7 (emptyNode) (emptyNode) (emptyNode)))))
; 1
; / | \
; 2 3 4
; / | \
; 5 6 7
; |
; 8
;f
; a function, f, used in MaptoTree
(define (f b)
(* b 2))
;MaptoTree
; takes a function, f, and a tree structure, tree, as parameters.
; it should then produce a new tree structure where f has been applied to each value in the original tree
(define (MaptoTree f T)
(if (pair? T)
((map (lambda (x) (MaptoTree f x)) (rest T)))
(f T)))
编辑:删除了有关将结构转换为列表的问题
最佳答案
您必须使用 node
选择器,而不是 pair?
、rest
等。我们使用 struct
来表示树,而不是普通的列表。
解决这个问题后,我们只需遍历树,对每个值应用该函数,然后构建一棵新树 - 像这样:
(define (MaptoTree f T)
(if (emptyNode? T)
(emptyNode)
(node (f (node-value T))
(MaptoTree f (node-left T))
(MaptoTree f (node-middle T))
(MaptoTree f (node-right T)))))
关于data-structures - 将函数应用于 Racket 中的树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62108365/