2015-02-16 8 views
0

Я пытаюсь пересекаются два списка на рэкет, но следующий код не работает:Ракетка Пересечение двух списков

(define (intersection a b) 
    (if (null? a) 
    '() 
    (if (contains (car a) b) 
     (cond (car a)(intersection (cdr a) b)) 
     (intersection (cdr a) b)))) 

Результат всегда в конечном итоге является первым пунктом списка а, который содержится в списке Ь , плюс остальная часть списка a. Например:

a = '(1 2 3 4 5 6) 
b = '(10 20 4 30 33) 

вернуться бы:

'(4 5 6) 

Я уверен, что содержит работает правильно, поэтому ошибка должна быть в коде я отправил. Благодаря!

ответ

0

cond является специальной формой и заменой на место для вложенных if. Мне кажется, что вы не намерены проверить, если car было правдой, так что a всегда будет результат, поэтому я думаю, что вы на самом деле хотели использовать было cons вместо:

(define (intersection a b) 
    (if (null? a) 
     '() 
     (if (contains (car a) b) 
      (cons (car a) (intersection (cdr a) b)) 
      (intersection (cdr a) b)))) 

(define contains member) ; contains wasn't defined by I guess member will do 

(intersection '(1 2 3 4 7) '(3 4 5 6)) ; ==> (3 4) 
+0

это было именно это! Я ненавижу ошибки typo = (. Спасибо –

3

Эй, если вы не делать это для удовольствия вы можете использовать set-intersect функции ракетки в

(set-intersect '(1 2 3 4 7) '(3 4 5 6)) ; => '(4 3) 
+0

Привет, спасибо за комментарий. Это было для задания. Поскольку ошибка не была концептуальной, мне разрешалось выходить в онлайновую систему для помощи = P –

Смежные вопросы