【问题标题】:I'm getting an error while trying to make a phone book with a binary tree in Scheme尝试在 Scheme 中使用二叉树制作电话簿时出错
【发布时间】:2016-10-19 14:12:20
【问题描述】:
  1. 编写一个函数(make-phone-book name number left right),它接受一个名字、一个电话号码和左右子树,并创建一个新的电话簿树。您的树节点应采用 ((name . phone-number) left-tree right-tree) 形式,其中 name 和 phone-number 是一对。

    我明白了:

    (define (make-phone-book name number left right)
    (list (cons name number) left right))
    
  2. 编写函数 get-name、get-number、get-left 和 get-right,它们会从给定的电话簿中返回适当的数据。

    我明白了:

    (define (get-name book)(caar book))
    (define (get-number book)(cdar book))
    (define (get-left book)(cadr book))
    (define (get-right book)(cddr book))
    
  3. 编写一个函数(插入电话簿名称号码),将新条目插入电话簿。您可以使用内置函数'string=? ' , '字符串>? ' 和 ' 字符串

    (define (insert book name number)
    (cond
    ((null? name) make-phone-book name number '() '())
    ((string=? (get-name book) name) book)
    ((string<? (get-name book) name) (make-phone-book name number
                                         (insert (get-left book) name number)
                                         (get-right book)))
    ((string>? (get-name book) name) (make-phone-book name number
                                         (get-left book)
                                         (insert (get-right book) name
    number)))))
    

它给出了错误:

caar: contract violation
  expected: (cons/c pair? any/c)
  given: '("Harry" 5550011)

【问题讨论】:

  • 你违反了合同。它需要一个(cons/c pair? any/c),而你提供给它的是'("Harry" 5550011)

标签: scheme containers binary-tree


【解决方案1】:

有几个小错误。

  1. (null? name) 应该是 (null? book)
  2. 在同样的情况下,您忘记将结果表达式括起来:(make-phone-book name number '() '())
  3. 递归时,应将(get-name book)(get-number book) 传递给make-phone-book,而不是namenumber

测试时,仅使用make-phone-bookinsert 创建树。
不要手写树。

【讨论】:

  • (insert '(("Stanley" 5550004) ("Larry" 5550007)) "Esmerelda" 5550021) '(("Esmerelda" . 5550021) ("Larry" 5550007) ())跨度>
  • 但是当我尝试 (insert '(("Stanley" 5550004) ("Larry" 5550007)) "Esmerelda" 5550021) 它返回 '(("Esmerelda" . 5550021) ("Larry" 5550007 ) ())
  • @WentaoHu '(("Stanley" 5550004) ("Larry" 5550007)) 不是有效的电话簿。使用make-phone-bookinsert 一路构建树。
  • @WentaoHu 我错过了其他几个错误。见编辑。
  • 另外,get-right 的定义错误,因为节点是用list 而不是list* 制作的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多