【发布时间】:2018-04-18 19:41:18
【问题描述】:
我正在尝试在 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。 有人能解释一下我为什么错了吗?
【问题讨论】:
-
你为什么要使用
set!?这与您使用的函数式编程标签相反。还要注意set!的返回值是未指定的,有些实现返回分配的值,有些什么都不返回。
标签: functional-programming scheme lisp binary-search-tree