【问题标题】:Racket/Scheme - checking to see if a list is a sublist of another listRacket/Scheme - 检查一个列表是否是另一个列表的子列表
【发布时间】:2021-01-04 20:51:41
【问题描述】:

我对球拍编码不熟悉,但我想定义一个程序来检查给定列表是否是另一个列表的子列表(或一部分)。

这是我目前的代码:

(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))

它在应该返回 #t 时返回 #f 我尝试跟踪子列表?程序,但它没有返回任何有用的信息。

我的代码有逻辑错误吗?

【问题讨论】:

    标签: list recursion scheme racket sublist


    【解决方案1】:

    存在逻辑错误。 sublist? 的默认情况应调用 sublist?,但改为调用 prefix?,因此您的 prefix? 仅当匹配位于索引 0 或 1 中时才会为真。

    您还创建了一个相当复杂的prefix?。不是逐个比较元素直到它们中的任何一个为空,而是在返回 #f 之前执行 O(n) 删除最后一个元素直到有一个空列表,即使前两个元素不同。我会比较第一个元素,然后在两个 args 中使用rest 重复出现,直到任一列表为空。哪一个取决于结果,例如。 (prefix '(a b) '(w a d f s)) 将在 aw 之间的第一次检查后停止计算。

    【讨论】:

      【解决方案2】:

      试试这个:

      (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) )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多