2012-02-24 2 views
1

Я хочуфункции члена Scheme, не зная моего определения

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

вернуть ложные

, что я делаю неправильно

(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))) 
))) 

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

ответ

3

((нуль? Список) #t)

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

+0

Спасибо, что работает :) – marcwho

2

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

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

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

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

(member? 'x '((a b) (c (x)))) 
> #t