加入有重叠的列表
Join lists with overlap
我正在尝试创建一个函数来查找两个列表之间的重叠区域和 returns 将两个列表连接在一起的结果。重叠区域是第一个列表的最长后缀,它与第二个列表的前缀匹配,并且在结果序列中只出现一次。
> (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 中。
你的 list-prefix?
函数看起来是正确的,只是没有必要检查 (pair? lst2)
:这排除了两个列表是同一个列表的可能性。你反而想要 (not (null? lst2))
.
要确定重叠区域是什么,您只需遍历 lst1
并检查每个位置之后的列表是否是 lst2
的前缀,以及 return 第一个这样的子列表。
这是我的版本:
#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))))
请注意,如果 lhs
为空,则 list-prefix?
returns 为真,因此这是一个充分的基本情况。
我正在尝试创建一个函数来查找两个列表之间的重叠区域和 returns 将两个列表连接在一起的结果。重叠区域是第一个列表的最长后缀,它与第二个列表的前缀匹配,并且在结果序列中只出现一次。
> (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 中。
你的 list-prefix?
函数看起来是正确的,只是没有必要检查 (pair? lst2)
:这排除了两个列表是同一个列表的可能性。你反而想要 (not (null? lst2))
.
要确定重叠区域是什么,您只需遍历 lst1
并检查每个位置之后的列表是否是 lst2
的前缀,以及 return 第一个这样的子列表。
这是我的版本:
#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))))
请注意,如果 lhs
为空,则 list-prefix?
returns 为真,因此这是一个充分的基本情况。