你好,大家请原谅任何滥用该语言的行为
我需要创建myPermutation(L1,L2)。给定列表L1(具有许多连续出现的元素)返回列表L2,列表L2的排序方式是没有两个连续的相同元素
示例:给定列表L1 [1,1,1,1,1,2,2,3,3,4,4,5,5] L2应该是[1,2,1,5,1,3,1 ,4,1,2,3,5,4]
我尝试了随机排列并检查了每个排列的一致性,但速度非常慢(L1大约有12个元素,约为24 cpus)
唯一可能的解决方案是进行一致的排列,而不是检查一个
但是我该怎么办呢?
即使使用标准的序言,它也可以完成probalby,但是由于我对逻辑编程的理解还很差,所以我无法理解
谢谢你:D
最佳答案
您可以构建检查列表的排列。
myPermutation([], []).
myPermutation(L, [H|P]):-
select(H, L, NL), % Select one item from the list
myPermutation(NL, H, P).
myPermutation([], _, []).
myPermutation(L, H, [I|P]):-
select(I, L, NL), % Select another item
I \= H, % Enforce restriction of no duplicate consecutive items
myPermutation(NL, I, P).
回溯时,此代码将提供所有有效的排列。我将把练习留给您一种方法来丢弃重复的排列。