首页 > 解决方案 > 查找具有从 1 到 K 的所有数字的第一个子列表

问题描述

我需要找到具有从 1 到 K 的所有数字的第一个子列表并返回它及其长度。

提前抱歉编辑不好


所以我检查 1 到 K 是否在子列表中,如果没有,那么我从

NumList ,将其附加到我们的结果(SubList)并递归调用该函数

将尾部作为我们要检查的新列表。

findFirstSubListHavingAllColors( NumList, [Hd|Tl] ,SubList, X):-
   (   oneToKinSub(SubList,NumList)
   ->  length(SubList,X)
   ;   delete(NumList,Hd,NumList1),
       append(SubList,[Hd],SubList1),
       findFirstSubListHavingAllColors(NumList1,Tl,SubList1,_)
   ).

oneToKinSub(_,[]).
oneToKinSub(SubString,[Hd|Tl]) :-
   member(Hd,SubString),
   oneToKinSub(SubString,Tl).

例如,如果

数字列表 =[1,2,3]

[高清|Tl] =[ 1,3,1,3,1,3,3,2 ,2,1]

预期的结果应该是 SubList=[1,3,1,3,1,3,3,2] 和 X= 8

标签: prolog

解决方案


您可以使用append/3andsubtract/3来获取包含所有项目的第一个子列表:

findFirstSubListHavingAllColors( NumList, List ,SubList, Len):-
  once((
   append(SubList, _, List),        % get SubList
   subtract(NumList, SubList, []),  % test whether NumList is contained in SubList
   length(SubList, Len)
  )).

once/1这是为了避免在回溯中获得其他(错误的)解决方案。


推荐阅读