-1

该函数称为子列表?有两个参数(两个列表)。它检查 l2 是否是 l1 的子列表并返回 #t 或 #f。

到目前为止我有这个,但似乎存在功能无法正常工作

(define (sublist? l1 l2)
  (cond ((null? l2) #t)
        ((exists l1 (car l2)) #t)
        (else (sublist? l1 (cdr l2)))))
(define (exists l p)
  (if (null? l) #f
      (or (equal? p (car l)) (exists (cdr l) p))))

更新

4

2 回答 2

0

首先,我认为在您的exists功能中,您缺少一个equals?

似乎第一个参数应该是一个原子,但是在您的子列表函数中,您首先发送列表,然后发送原子,您需要切换参数。

(define (exists l p)
  (if (null? l) #f
      (or (equal? p (car l)) (exists (cdr l) p))))

那应该可以正常工作。

此外,将谓词函数称为问题的约定,您应该将其命名exists?

[编辑]

同样经过仔细检查,它看起来像您的子列表?功能不正确。即使列表中只存在子列表的一个元素,它也会返回#t。您需要将其修改为:

 (define (sublist? l1 l2)
  (cond ((null? l2) #t)
        ((not (exists l1 (car l2))) #f)
        (else (sublist? l1 (cdr l2)))))

现在你说:

1) 是空的吗?然后是一个子列表。

2) 这个元素不在列表中吗?然后不是。

3) 如果是,则检查其余元素。

于 2012-09-29T18:11:52.663 回答
0

我相信前面的答案只检查子集,而不是子列表。子列表的顺序很重要,因此您不能简单地检查列表中元素的存在。您需要执行以下操作。

(define (sublist? l1 l2)
  (cond ((null? l2) #t)
        ((null? l1) #f)
        ((headlist? l1 l2) #t)
        (else (sublist? (cdr l1) l2)))

(define (headlist? l1 l2)
  (cond ((null? l2) #t)
        ((null? l1) #f)
        ((not (equal? (car l1) (car l2))) #f)
        (else headlist? (cdr l1) (cdr l2))))
于 2012-10-03T21:23:39.187 回答