0

我做了一个程序,它正在搜索一个元素是否是列表的一部分,但它不适用于单词我的程序:

(define (element? xs lst) 
  (cond ((null? lst) #f) 
        ((eq? xs (car lst)) #t) 
        (#t (element? x (cdr lst)))))

例子:

>(element? 'three (quote ((quote three) (quote four) (quote five))))
>,=> #f but i need #t 

请帮忙。

4

3 回答 3

1

当 Scheme 遇到 a(quote x)或其缩写形式时'xx 是未评估的结果。从而(quote ((quote three) (quote four) (quote five)))成为列表((quote three) (quote four) (quote five))。我认为您的意思是 pass (quote (three four five)),您可以编写它'(three four five)并且您的程序会起作用,因为您正在搜索的是第一个元素。

如果搜索的元素不是 lst 中的第一个元素,则会出现一个错误,即您有一个未绑定的变量使其无法工作。x我猜这实际上应该是绑定变量xs。我已将 every 重命名xsx(因为 xs 通常表示一个列表,而这里它是一个搜索元素)

(define (element? x lst) 
  (cond ((null? lst) #f) 
        ((eq? x (car lst)) #t) 
        (else (element? x (cdr lst)))))

(element? 'c '(a b c d e f)) ; ==> #t
(element? 'g '(a b c d e f)) ; ==> #f
(element? (quote e) (quote (a b c d e))) ; ==> #t

如果您真的想搜索符号以外的其他内容,则应使用equal?代替eq?,如下所示:

(define (element? x lst) 
  (cond ((null? lst) #f) 
        ((equal? x (car lst)) #t) 
        (else (element? x (cdr lst)))))

(element? '(hello dolly) '((hello paul) (hello dolly) (hello todd))) ; ==> #t
于 2013-10-13T20:52:40.127 回答
0

在 Scheme 中确实没有“单词”的概念——你有符号或字符串。从您所写的内容中,您正在寻找符号。您的代码有许多简单的错误,这里是一个简单的版本:

(define (element? xs lst)
  (and (not (null? lst))
       (or (eq? xs (car lst))
           (element? xs (cdr lst)))))


> (element? 'three (list 'three 'four 'five))
#t

注意:任何时候你看到cond返回值#t或者你可能更#f喜欢重写andor

于 2013-10-14T01:30:36.850 回答
-1

eq?测试两个对象是否在内存中的相同位置。它实际上并不比较值。如果您在两个不同的内存位置构造相同的字符串,则eq?返回false. 改为使用string=

我想展示一些示例代码,但 Scheme 正在积极地保留字符串,我无法让两个单独分配的相同字符串存在......

相关问题

于 2013-10-13T20:49:13.443 回答