加入重叠列表

时间:2015-03-08 06:14:54

标签: scheme racket

我正在尝试创建一个函数来查找两个列表之间的重叠区域,并返回将两个列表连接在一起的结果。重叠区域是第一个列表中与第二个列表的前缀匹配的最长后缀,并且它仅在结果序列中出现一次。

> (list-overlap '(a a a t t t t) '(t t t t g g g g g))
(list 'a 'a 'a 't 't 't 't 'g 'g 'g 'g 'g)
> (list-overlap '(a a a) '(g g g))
(list 'a 'a 'a 'g 'g 'g)
> (list-overlap '(a t t a) '(t t a a))
(list 'a 't 't 'a 'a)

我创建了一个检查完全重叠的函数,但我不知道如何只搜索部分然后完成问题。这是前缀部分的内容:

(define (list-prefix? lst1 lst2)
  (or (null? lst1)
      (and (not (null? lst2))
           (equal? (first lst1 ) (first lst2))
           (list-prefix? (rest lst1 ) (rest lst2)))))

我原以为你会使用(reverse ...)并逐个检查每个元素,但是一旦到达最后一个元素,我就无法删除其余元素,因为列表没有子字符串函数

任何帮助都会很棒。在ISL。

2 个答案:

答案 0 :(得分:2)

您的list-prefix?功能显示正确,只是无需检查(pair? lst2):这排除了两个列表相同列表的可能性。你想要(not (null? lst2))

要确定重叠区域是什么,您只需遍历lst1并检查每个位置后的列表是否为lst2的前缀,并返回第一个此类子列表。

答案 1 :(得分:1)

这是我的版本:

#lang htdp/isl
(define (list-prefix? lhs rhs)
  (or (empty? lhs)
      (and (not (empty? rhs))
           (eqv? (first lhs) (first rhs))
           (list-prefix? (rest lhs) (rest rhs)))))

(define (list-overlap lhs rhs)
  (if (list-prefix? lhs rhs)
      rhs
      (cons (first lhs) (list-overlap (rest lhs) rhs))))

请注意,如果list-prefix?为空,lhs会返回true,因此这是一个充分的基本情况。