List Racket/Scheme-检查一个列表是否是另一个列表的子列表

List Racket/Scheme-检查一个列表是否是另一个列表的子列表,list,recursion,scheme,racket,sublist,List,Recursion,Scheme,Racket,Sublist,我对racket中的编码还不熟悉,但我想定义一个过程来检查给定列表是否是另一个列表的子列表(或部分列表) 这是我目前的代码: (define prefix? (lambda (lst1 lst2) (cond ((equal? lst1 lst2) #t) ((null? lst2) #f) (else (prefix? lst1 (reverse (rest (reverse lst2)))))))) (define sublist? (

我对racket中的编码还不熟悉,但我想定义一个过程来检查给定列表是否是另一个列表的子列表(或部分列表)

这是我目前的代码:

(define prefix?
  (lambda (lst1 lst2)
    (cond 
      ((equal? lst1 lst2) #t)
      ((null? lst2) #f)
      (else (prefix? lst1 (reverse (rest (reverse lst2))))))))

(define sublist?
  (lambda (lst1 lst2)
    (cond
      ((prefix? lst1 lst2) #t)
      ((null? lst2) #f)
      (else (prefix? lst1 (rest lst2))))))
我已经尝试了大多数案例,它按照预期的方式工作,但是当我尝试这个测试案例时:

(sublist? '(a b d) '(a b c a b d e))
它在应该返回时返回f 我试过追踪子列表?程序,但它没有返回任何有用的信息


我的代码中有逻辑错误吗?

有逻辑错误。
子列表?
的默认情况应调用
子列表?
,而应调用
前缀?
,因此只有在索引0或1中匹配时,您的
前缀?
才会为真


您还创建了一个相当复杂的
前缀?
。在返回
#f
之前,不要逐个比较元素直到其中任何一个元素为空,而是对最后一个元素进行O(n)删除,直到有一个空列表,即使前两个元素不同。我会比较第一个元素,然后在两个参数中重复使用
rest
,直到其中一个列表为空。哪一个取决于结果,例如
(前缀“(a b)”(w a d f s))
将在
a
w
之间的第一次检查后停止计算。存在逻辑错误。
子列表?
的默认情况应调用
子列表?
,而应调用
前缀?
,因此只有在索引0或1中匹配时,您的
前缀?
才会为真

您还创建了一个相当复杂的
前缀?
。在返回
#f
之前,不要逐个比较元素直到其中任何一个元素为空,而是对最后一个元素进行O(n)删除,直到有一个空列表,即使前两个元素不同。我会比较第一个元素,然后在两个参数中重复使用
rest
,直到其中一个列表为空。哪一个取决于结果,例如
(前缀“(a b)”(w a d f s))
将在
a
w
之间的第一次检查后停止计算尝试以下操作:

(define sub?
  (lambda (l sub)
    (define test (lambda (x) (equal? x sub)))
    ((lambda (s) (s s l test))
     (lambda (s l k)
       (or (k '())
           (and (pair? l)
                (s s (cdr l)
                   (lambda (r)
                     (or (test r)
                         (k (cons (car l) r)))))))))))


(sub? '(a b c a b d e) '(b d e) )
(sub? '(a b c a b d e) '(c a b) )
(sub? '(a b c a b d e) '(a b c) )
(sub? '(a b c a b x e) '(a b d) )
试试这个:

(define sub?
  (lambda (l sub)
    (define test (lambda (x) (equal? x sub)))
    ((lambda (s) (s s l test))
     (lambda (s l k)
       (or (k '())
           (and (pair? l)
                (s s (cdr l)
                   (lambda (r)
                     (or (test r)
                         (k (cons (car l) r)))))))))))


(sub? '(a b c a b d e) '(b d e) )
(sub? '(a b c a b d e) '(c a b) )
(sub? '(a b c a b d e) '(a b c) )
(sub? '(a b c a b x e) '(a b d) )