方案,子列表

时间:2012-09-29 17:24:48

标签: scheme

该功能被称为子列表?有两个参数(两个列表)。它检查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))))

更新

2 个答案:

答案 0 :(得分: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)如果是,则检查其余元素。

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