我在尝试使用Scheme中的二叉树制作电话簿时收到错误

时间:2016-10-18 18:25:37

标签: scheme containers binary-tree

  1. 编写一个功能(制作电话簿名称编号左侧),其中包含姓名,电话号码以及左右子树,并创建新的电话簿树。您的树节点应该是((名称。电话号码)左树右树)的形式,其中名称和电话号码是一对。

    我得到了:

    (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 =? ','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)))))
    
  4. 它给出错误:

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

1 个答案:

答案 0 :(得分:0)

有几个小错误。

  1. (null? name)应为(null? book)
  2. 在同样的情况下,您忘记括起结果表达式:(make-phone-book name number '() '())
  3. 当你递归时,你应该将(get-name book)(get-number book)传递给make-phone-book,而不是namenumber
  4. 测试时,只能使用make-phone-bookinsert来创建树 不要手工写树。