@Ed'kaが提供するソリューションは簡潔で素晴らしいですが、それにもかかわらず、その複雑さはO(N)
.
電力の計算が複雑になる2 乗法によるべき乗を考慮することをお勧めします。O(log(N))
この手法を使用すると、次のような方法でデカルト パワーを実装できます。
%% Entry point
cart(List, N) ->
Tmp = [[X] || X <- List],
cart(Tmp, Tmp, N).
cart(_InitialList, CurrList, 1) ->
CurrList;
cart(_InitialList, CurrList, N) when N rem 2 == 0 ->
Tmp = mul(CurrList, CurrList),
cart(Tmp, Tmp, N div 2);
cart(InitialList, CurrList, N) ->
Tmp = cart(InitialList, CurrList, N - 1),
mul(InitialList, Tmp).
mul(L1, L2) ->
[X++Y || X <- L1, Y <- L2].
PSシェルからの使用例(関数cart
を mudule にパックしましたmy_module
):
1> c(my_module).
{ok,my_module}
2>
2> my_module:cart([0,1], 2).
[[0,0],[0,1],[1,0],[1,1]]
3>
3> my_module:cart([0,1], 3).
[[0,0,0],
[0,0,1],
[0,1,0],
[0,1,1],
[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]]