大家好! 我在查找列表中最小元素的所有出现位置时遇到了一些问题。
我的源代码是这样的:
**
findPos([], _, []).
findPos([_],_,[1]).
findPos([H1|Tail], Pos, [Pos|Ta]):-
% "Pos" is the current position in the list
findMin([H1|Tail], V),
V=[H1],
Pos2 is Pos+1,
findPos([Tail], Pos2, [Ta]).
findPos([H1|Tail], Pos, [Ta]):-
findMin([H1|Tail], V),
not(V=[H1]),
Pos2 is Pos+1,
findPos([Tail], Pos2, [Ta]).**
其中, findMin 作为第一个参数接收列表,并使用第二个参数(该列表的最小元素)返回。 问题在于,我会给出的每个输入列表(除了答案为[]的空格列表),答案总是1 ......我无法看到我所遗漏的内容..任何答案都会不胜感激:D谢谢!
答案 0 :(得分:0)
请注意,每次重新计算剩余列表的最小值时,您的程序因此[1,7,1,2,3]
列表会将[1,1,2,3]
列为列表" minima"。此外,这个过程相当昂贵。
另一个方面是你在列表的语法糖方面犯了一些语法错误,这会导致错误。
解决方案是 - 在计算机科学中很常见 - 来区分问题。我建议findPos
只会找到给定项目的索引。这样的findPos/3
谓词可能如下所示:
findPos(X,L,Is) :-
findPos(0,X,L,Is).
findPos(_,_,[],[]).
findPos(I,X,[Y|T],MIT) :-
(X == Y -> MIT = [I|IT];MIT=IT),
I1 is I+1,
findPos(I1,X,T,IT).
谓词使用累加器I
来跟踪索引,每次都递增索引。
现在你需要创建一个查找最小元素索引的谓词:
findMinPos(L,Is) :-
findMin(L,M),
findPos(M,L,Is).