我偶然发现了这个question。
问题在于找到两个列表的数字之间存在多少个相等的结尾数字。给出的答案似乎很有效,使用树来实现类似于trie的东西。但是,在使用它的过程中,我发现它的行为与我预期的有所不同:当第二个列表中有多个“单词”与第一个列表中的一个具有“相似性”时,返回一个仅与一个匹配词之一的匹配位数一起出现一次。为每场比赛返回答案会更正确吗?
我试图思考如何做到这一点,但是我无法提出任何好的建议(我是序言中的初学者...)
为方便起见,我发布了gusbro的answer中的代码:
same_endings(L1, L2, Endings):-
build_tree(L1, Tree),
maplist(same_ending(Tree), L2, Endings).
same_ending(Tree, N, N-Len):-
atom_chars(N, Digs),
reverse(Digs, RDigs),
same_ending1(RDigs, Tree, 0, Len).
same_ending1([], _, Len, Len).
same_ending1([Dig|Digs], Tree, Len, Len2):-
(select(Dig-SubTree, Tree, _) ->
(succ(Len, Len1), same_ending1(Digs, SubTree, Len1, Len2)) ;
Len2=Len
).
build_tree(L, Tree):-
foldl(add_tree, L, [], Tree).
add_tree(N, Tree, NTree):-
atom_chars(N, Digs),
reverse(Digs, RDigs),
add_tree1(RDigs, Tree, NTree).
add_tree1([], Tree, Tree).
add_tree1([Dig|Digs], Tree, [Dig-SubTree1|Tree1]):-
(select(Dig-SubTree, Tree, Tree1) -> true; SubTree-Tree1=[]-Tree),
add_tree1(Digs, SubTree, SubTree1).
示例:
same_endings([123,223,333],[423,433],Endings).
Endings = [423-2, 433-2].
我希望更合理的答案是
Endings = [423-2, 423-2, 423-1, 433-1, 433-1, 433-2].