Функция-член схемы, неуверенная в моем определении - PullRequest
1 голос
/ 25 февраля 2012

Я хочу, чтобы

(member? 'a '((d d) (d d)))

вернул false

что я делаю не так

(define (member? x list)
 (cond
  ((null? list) #t )
   (else ( or (or (eq? (car (car list)) x) (eq? (cdr (car list)) x)) (member? x (cdr list) ))  
)))

Если кто-то может сказать мне, что не так с моей функцией-членом, ябыл бы очень признателен.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

((null? List) #t)

Вы возвращаете true, если список пуст. Это неправильно.

2 голосов
/ 25 февраля 2012

Попробуйте, это более общее решение:

(define (member? ele lst)
  (cond ((null? lst) #f)
        ((not (list? lst))
         (equal? ele lst))
        (else (or (member? ele (car lst))
                  (member? ele (cdr lst))))))

Обратите внимание, что если вы хотите искать внутри списка (произвольно вложенных) списков, рекурсия немного более сложна: вам нужнорассмотрим случаи, когда список пуст, когда список является не списком, а одним элементом, и вам нужно повторяться в обеих частях списка: car и cdr.

Например, приведенное выше определение будетработа для списков, таких как это:

(member? 'x '((a b) (c (x))))
> #t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...