1

我想使用“eq”、“null”等“member”函数。但是,我不知道该如何解决?

(define (member atm lst)
    (cond
        ((null? lst) #F)
        ((eq? atm (car lst)) #T)
        (else (member atm (cdr lst)))
    )
)

以及我用过的地方;

(define (duplicate-entries lst)
    (cond
        ((null? lst) #F)
        ((member? (car lst) (cdr lst))) #T)
        (else duplicate-entries (cdr lst))
    )
)

member?不起作用,我该如何解决?

4

2 回答 2

2

您在使用时定义了member函数member?。定义membermember?(define (member? atm lst) ... )

于 2013-01-03T11:32:31.487 回答
1

让我们依次看一下每个过程,首先member。请注意,memberScheme 中已经有一个标准函数,因此定义一个具有相同名称的新过程是个坏主意。以下是现有member程序的作用:

member定位 lst 的第一个元素equal?to v。如果存在这样的元素,则返回以该元素开头的 lst 的尾部。否则,结果为#f

上述过程equal?用于测试并返回与您期望的值不同的值。更接近预期的过程,我们有标准memq功能:

memq喜欢成员,但使用 eq? 查找元素。

但同样,返回的值不是您所期望的。我建议您像这样定义您的过程,注意我们正在使用memq,并且根据约定,名称以 a 结尾?表示这是一个布尔过程:

(define (member? atm lst)
  (if (memq atm lst) #t #f))

现在让我们来看看duplicate-entries。有几个括号问题(正确缩进代码会显示这一点),并且成员资格过程的名称存在问题(您的过程被调用member但您将其调用为member?)。您可以使用member?我们上面刚刚定义的方法,或者使用memq,这两种方法在这种情况下都可以正常工作,因为memq如果找到元素将返回一个非假值,这将使条件为真:

(define (duplicate-entries lst)
  (cond ((null? lst) #f)
        ((member? (car lst) (cdr lst)) #t)
        (else (duplicate-entries (cdr lst)))))

或者这是推荐的方法 - 如果现有程序可以满足您的需要,则无需重新发明轮子:

(define (duplicate-entries lst)
  (cond ((null? lst) #f)
        ((memq (car lst) (cdr lst)) #t)
        (else (duplicate-entries (cdr lst)))))
于 2013-01-03T13:52:23.593 回答