是否有一种简单的方法可以获得没有双打的列表的所有组合。没有双打,我的意思也是没有彼此的排列。所以没有[a,b,c]
和[c,a,b]
或[c,b,a]
。
因此对于输入[a,b,c],输出将为:
[a]
[b]
[c]
[a,b]
[a,c]
[b,c]
[a,b,c]
我只能找到带有双打(排列)的解决方案
答案 0 :(得分:4)
这个问题的解决方案很简单:显然只有一个空集合中的一个组合:空集:
var expires=moment().add(1,'days').valueOf();
var token = jwt.encode(user, config.secret,{
exp: expires}),app.get('jwtTokenSecret'));
此外,对于每个元素,您可以决定是否添加它:
combs([],[]).
由于您按照列表的顺序选择(或删除),这可以保证您以后不会重新选择combs([H|T],[H|T2]) :-
combs(T,T2).
combs([_|T],T2) :-
combs(T,T2).
。如果您将其a
提供给它,则永远不会生成类似[a,b,c]
的内容,因为一旦决定选择/删除[b,a,c]
,就无法添加a
并重新决定b
。
运行此命令:
a
如果你想以相反的方式生成它(对第一个删除元素有更多的测试,而不是添加它们,你可以简单地交换递归语句):
?- combs([a,b,c],L).
L = [a, b, c] ;
L = [a, b] ;
L = [a, c] ;
L = [a] ;
L = [b, c] ;
L = [b] ;
L = [c] ;
L = [].
在这种情况下,结果将是:
combs([],[]).
combs([_|T],T2) :-
combs(T,T2).
combs([H|T],[H|T2]) :-
combs(T,T2).
如果你想要排除空列表,你可以通过在通话中添加另一张支票来做到这一点:
?- combs([a,b,c],L).
L = [] ;
L = [c] ;
L = [b] ;
L = [b, c] ;
L = [a] ;
L = [a, c] ;
L = [a, b] ;
L = [a, b, c].
您可以在以下函数中定义:
?- combs([a,b,c],L),L \= [].
或者通过重写combs_without_empty1(LA,LB) :-
combs_without_empty1(LA,LB),
LB \= [].
函数。在这种情况下,您最好使用累加器来计算当前所选元素的数量:
comb/2
combs_without_empty(L,C) :-
combs_without_empty(L,0,C).
有点复杂。如果列表只包含一个元素,则应检查combs_without_empty/3
是否大于零。如果是这种情况,我们可以选择是否添加元素。如果N
为零,我们必须包含它。所以:
N
我们还必须实现一个递归部分,在我们选择一个元素时将递增combs_without_empty([A],_,[A]).
combs_without_empty([_],N,[]) :-
N > 0.
:
N
全部放在一起给出了:
combs_without_empty([_|T],N,T2) :-
combs_without_empty(T,N,T2).
combs_without_empty([H|T],N,[H|T2]) :-
N1 is N+1,
combs_without_empty(T,N1,T2).
产生:
combs_without_empty(L,C) :-
combs_without_empty(L,0,C).
combs_without_empty([A],_,[A]).
combs_without_empty([_],N,[]) :-
N > 0.
combs_without_empty([_|T],N,T2) :-
combs_without_empty(T,N,T2).
combs_without_empty([H|T],N,[H|T2]) :-
N1 is N+1,
combs_without_empty(T,N1,T2).
答案 1 :(得分:4)
没有辅助检查空列表的干净解决方案只是从规则中排除空列表。基本情况应该是单个元素组合:
comb_without_empty([H|_], [H]). % Simple case of one element comb
comb_without_empty([_|T], C) :- % Combinations of the tail w/o head
comb_without_empty(T, C).
comb_without_empty([H|T], [H|C]) :- % Combinations of the tail including head
comb_without_empty(T, C).
| ?- comb_without_empty([a,b,c], L).
L = [a] ? a
L = [b]
L = [c]
L = [b,c]
L = [a,b]
L = [a,c]
L = [a,b,c]
(1 ms) no
| ?-