我试图实现第n个排列(nPr => per(n,L,Out)
),但我一直都是假的。
这是我想要做的事情;
per(0,_,[]).
per(_,[],[]).
per(R,[H|T1],[H|T]):-
R1 is R-1,
per(R1,T1,[H|T]),
per(R1,T1,T).
我做错了什么?
还有(更简单)使用内置置换谓词实现第n个排列(nPr)的方法吗?
答案 0 :(得分:1)
天真的解决方案是使用findall/3
或bagof/3
收集所有排列,然后从列表中选择您需要的排列。
如果您使用的是SWI-Prolog,则可以使用offset/2
中的library(solution_sequences)
。
once( offset(N, permutation(List, Permutation)) )
或者,您也可以查看this answer以获取call_nth/2
的定义,并使用它:
call_nth(permutation(List, Permutation), N)
但是,当然,如果您对此非常认真,那么您应该找到列表中的n-th permutation索引,并使用它来生成排列。
答案 1 :(得分:0)
per(R1,T1,[H|T]),
per(R1,T1,T).
您在这里说的是R1
- T1
的排列等于[H|T]
和T
。那可能不是你的意思。
此外,根据您的per(0,_,[]).
,任何内容的第0个排列都是空列表。但是列表本身不是列表的第0个排列吗?换句话说,per(0, L, L)
?
(或者我是否误解了排列的编号?)