Scheme成员函数,不确定我的定义

时间:2012-02-24 21:31:23

标签: function scheme

我想要

(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 个答案:

答案 0 :(得分:3)

((null?list)#t)

如果列表为空,则返回true。那是错的。

答案 1 :(得分: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