Проверьте, равны ли два набора - схема - PullRequest
0 голосов
/ 21 сентября 2011
;checks to see if two sets (represented as lists) are equal

(define (setsEqual? S1 S2)
(cond
 ( (null? (cdr S1)) (in_member S1 S2))
 ( (in_member (car S1) S2) (setsEqual? (cdr S1) S2))
 (else false)))

;checks for an element in the list
(define (in_member x list)
(cond
 ( (eq? x (car list)) true)
 ( (null? list) false)
 (else (in_member x (cdr list)))))

Не могу найти базовый вариант, чтобы заставить это работать. Любая помощь приветствуется!

1 Ответ

3 голосов
/ 22 сентября 2011

Что такое набор?(Это список --- хорошо, что такое список?) Вот подсказка: есть два варианта «списка»: '() (он же null, он же empty) и те, которые сделаны с cons.Ваши функции должны соответствовать структуре данных, которые они потребляют.Ваш нет.

Я рекомендую прочитать Как разрабатывать программы (текст доступен онлайн);это научит вас «рецепту дизайна» для решения подобных проблем.Грубая схема такова: опишите ваши данные полуформально (что отвечает что такое список? ), сформулируйте примеры и тесты;используйте ваше описание данных для создания шаблона для обработки данных такого типа;наконец, заполните шаблон.Ключевым моментом является то, что шаблон определяется определением данных.Его можно использовать повторно, и заполнение шаблона для определенной функции часто можно выполнить за секунд --- если вы правильно создали шаблон и примеры.

HtDP Глава 9 посвящена обработкесписки, в частности.Это поможет с in_member.Глава 17 рассказывает об обработке нескольких сложных аргументов (например, двух списков одновременно).Еще один совет: если бы я писал эту функцию, я бы использовал следующий факт о наборах: два набора равны, если каждый является подмножеством другого.

...