我正在尝试在 Scheme-Dr.Racket 中实现二叉树,但我在插入时遇到了一些问题!功能。
这是来源
(define (makeTree leftSubTree root rightSubTree)
(list leftSubTree root rightSubTree))
(define (subTree part tree)
(if (null? tree)
'()
(part tree)))
(define (root tree)
(subTree cadr tree))
(define (leftSubTree tree)
(subTree car tree))
(define (rightSubTree tree)
(subTree caddr tree))
(define (leaf? tree)
(and (null? (leftSubTree tree))
(null? (rightSubTree tree))))
; (define tree (makeTree (makeTree '() 1 '()) 2 (makeTree '() 3 '())))
(define (member? tree element)
(if (null? tree)
#f
(or (= (root tree) element)
(member? (leftSubTree tree) element)
(member? (rightSubTree tree) element))))
(define (insert! tree element)
(if (null? tree)
(set! tree (makeTree '() element '()))
(if (leaf? tree)
(cond
((> (root tree) element) (set! tree (makeTree (makeTree '() element '()) (root tree) '())))
((< (root tree) element) (set! tree (makeTree '() (root tree) (makeTree '() element '()))))
((= (root tree) element) '()))
(cond
((= (root tree) element) '())
((> (root tree) element) (insert! (leftSubTree tree) element))
(else (insert! (rightSubTree tree) element))))))
据我所知!函数更改对象 id 指向的值或
(set! tree (makeTree '() val '()))
要将树的值更改为具有一个节点的树 - val。 有人可以解释一下为什么我错了吗?
最佳答案
你的 insert!
函数只会影响名为 tree
的它自己的参数 的绑定(bind).
当函数返回时,它的参数绑定(bind)也随之销毁。
您想影响内存对象结构的变化您的参数tree
指的是。那不是什么set!
做。它只会更改变量绑定(bind)的值。
在 Scheme 中有 set-car!
和 set-cdr!
原语,但 Racket 的列表是不可变的。可变列表是用 mcons
创建的, 不适用于 cons
, 也不 list
. Racket 甚至没有 set-car!
和 friend ,并称他们为set-mcar!
等等,它们不适用于使用 list
创建的列表.
您可以使用 define-struct
将树表示从列表切换为结构。为此。
或者,选择合适的 #lang
放置在源文件开头的指令,例如#lang r5rs
所以set-car!
等工作;或使用 mcons
创建您的列表所以你可以使用 set-mcar!
等等,如果在 #lang racket
下工作:
> (define y (mcons 1 (mcons 2 '())))
> y
(mcons 1 (mcons 2 '()))
> (set-mcar! y 11)
> y
(mcons 11 (mcons 2 '()))
关于functional-programming - 如何在 Dr.Racket 中重新分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47140406/