【发布时间】:2019-05-15 17:54:22
【问题描述】:
问题是“查找包含从 1 到 K 的所有数字的列表的最小长度”。 输入 : 列表,K,N 其中 N 是列表的长度
我的算法(显然有点面向 C):
- 设置最小值= N+1
- 找到第一个包含从 1 到 K 的所有数字的子列表 (FSub)
- 如果没有,则 Min=0 并完成
- 如果有创建一个列表 C,它包含除第一个长度 (FSub) 元素之外的起始列表的所有元素。
找到最小值的函数(参数:FSub、C、NewList、Min)
- 如果 length(Fsub)=K 那么我们不必继续搜索,因为我们找到了 sublist 的最小长度
- 如果 FSub 的 Head 在 Fsub 的 Tail 中,那么我们从 FSub 中删除 Head,更新 min 并递归,
- 如果不是,那么我们将列表 C(在上面创建)的头部附加到 FSub 并递归。
如果 C 等于空列表,则停止
这个算法看起来很耗时,而且在某些大型列表的情况下,它可能会耗尽堆栈。
我 asked 关于第一个子列表部分并获得了此代码。
findFirstSubListHavingAllColors( NumList, List ,SubList, Len):-
once((
append(SubList, _, List), % get SubList
subtract(NumList, SubList, []), % test whether NumList is contained in SubList
length(SubList, Len)
)).
我无法找到解决办法。
示例
列表=[1,3,1,3,1,3,3,2,2,1] , K=3 , N=10
答案应该是 4,因为包含数字 1,2,3 的最小 SubList 是 [1,3,3,2] 或 [3,2,2,1]。
【问题讨论】:
标签: prolog