functional-programming - 如何在 Dr.Racket 中重新分配值

标签 functional-programming scheme lisp binary-search-tree

我正在尝试在 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/

相关文章:

list - Lisp 遍历函数中的列表

lisp - (loop for) 和 (loop :for) in Common Lisp 之间的区别

java - Java 中的函数式数据结构

functional-programming - 如何积累 Observable

计划项目构想

scheme - Scheme中的注释代码

function - 方案基本循环

emacs - 我如何改进 Emacs Lisp Intro 的 "create index entries"练习的解决方案?

haskell - 为什么我的 Haskell 函数参数必须是 Bool 类型?

functional-programming - 如何在 OCaml 中将字典实现为函数?