Может кто-нибудь объяснить, почему я получаю нарушение контракта mpair

#racket

Вопрос:

Определите процедуру СХЕМЫ с именем (сортировка по дереву l), которая берет список чисел и выводит тот же список, но в отсортированном порядке. Ваша процедура должна отсортировать список, (а) вставив числа в двоичное дерево поиска, а затем (б) извлекая из двоичного дерева поиска список элементов в отсортированном порядке. Для начала напишите процедуру под названием (insert-list L T), которая берет список чисел L и двоичное дерево поиска T и возвращает дерево, которое получается путем вставки всех чисел из L в T. (Сначала поместите аргумент L, поэтому вызов вашей функции должен иметь форму (вставка-список L T), где L-список, а T — (возможно, пустое) двоичное дерево поиска.) Затем напишите функцию sort-extract, которая берет двоичное дерево поиска и выводит элементы дерева в отсортированном порядке. (Мы делали это в классе!) Наконец, соедините эти две функции вместе для достижения (сортировка по дереву l). (Обратите внимание, что все три эти функции будут классифицированы, поэтому ваши решения должны состоять из трех функций верхнего уровня: вставка-список, сортировка-извлечение и сортировка по дереву.)

 (define (insert-list insert-elements T)
      (if (null? insert-elements)
          T
          (insert-list (cdr insert-elements)
                       (insert-list (car insert-elements) T))))

(insert-list (list 12) (list 15 (list) (list)))
 

mcdr:
ожидаемое нарушение контракта: mpair?
дано: 12

Комментарии:

1. Предполагается, что вы должны реализовать другую функцию, которая вставляет только один элемент, а затем использовать его в insert-list .

Ответ №1:

Вы получаете нарушения контракта, потому что звоните insert-list с car номером 12. Так как это не null? так, вы попытаетесь сделать car и cdr из этого. Что такое cdr число 12?

Также мне кажется странным, что вы не вызываете процедуру для добавления элемента в дерево из insert-list . Я не могу придумать ни одной веской причины для объединения этих двух процедур в одну.

Если у вас была процедура, которая принимает значение и дерево и возвращает дерево с добавленной стоимостью, вы можете сделать это:

 (define (insert-list lst tree)
  (foldl insert tree lst))
 

Напр..

 (insert-list '(5 2 4) '()) ; ==>
(insert 4 (insert 2 (insert 5 '())))