我正在尝试创建一个函数来查找两个列表之间的重叠区域,并返回将两个列表连接在一起的结果。重叠区域是第一个列表中与第二个列表的前缀匹配的最长后缀,并且它仅在结果序列中出现一次。
> (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。
答案 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,因此这是一个充分的基本情况。