在列表中找到一个缺失的号码

问题描述:

假设我有一个列表[2,1,4,5],我想要一个谓词返回3作为缺少的元素。在列表中找到一个缺失的号码

missing([], []). 
missing([H|T], R) :- missing([H|T], H, R). 
missing([], _I, []). 
missing([H|T], I, [I|R]) :- 
    H =\= I, 
    !, 
    NextI is I + 1, 
    missing([H|T], NextI, R). 
missing([_|T], I, R) :- 
    NextI is I + 1, 
    missing(T, NextI, R). 

但它不适用于未排序的列表。

+2

祝贺达到15个代表! :)你现在有权力为你认为合适的答案投票,并接受你认为为你的问题提供解决方案的答案。 – 2013-05-09 10:59:14

如果您的实现在未排序列表上不起作用,最简单的解决方法是在执行算法之前对输入列表进行排序。您可以通过将sort/2谓词添加到当前的实现中来完成此操作。

missing([], []). 
missing(Raw, R):- 
    sort(Raw, [H|T]), 
    missing([H|T], H, R). 
missing([], _I, []). 
missing([H|T], I, [I|R]):- 
    H =\= I, 
    !, 
    NextI is I + 1, 
    missing([H|T], NextI, R). 
missing([_|T], I, R):- 
    NextI is I + 1, 
    missing(T, NextI, R). 

测试:

?- missing([1,2,6], M). 
M = [3, 4, 5]. 

?- missing([1,2,6,-1], M). 
M = [0, 3, 4, 5]. 

?- missing([-1, 5], M). 
M = [0, 1, 2, 3, 4]. 

?- missing([-1, 5, -3], M). 
M = [-2, 0, 1, 2, 3, 4]. 

?- missing([5, -3], M). 
M = [-2, -1, 0, 1, 2, 3, 4]. 

似乎工作。

+0

@honey如果你觉得这个答案对于这个问题是足够的,你应该接受它:http://stackoverflow.com/faq#howtoask这有助于整个社区:它显示你的查询已经完成,它允许人们搜索类似问题有一个可接受的答案,它也表明你关心这个社区是如何工作的。 – joneshf 2013-05-08 16:24:22