単純なテール再帰を使用して、リストのリストのすべての置換を検索しようとしています。モジュールは次のようになります。再帰は順列の配列がネストされている巻き戻し残念なことにときエリクシルの2次元リストの置換
defmodule PermutationsSpec do
use ESpec
alias WaffleEventImporter.Permutations
describe "of/2" do
subject do: Permutations.of(list_list, [])
let :list_list, do: [[1,2,3],[1,2,3],[1,2,3]]
let :expected, do: [
[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3],[1,3,1],[1,3,2],[1,3,3],
[2,1,1],[2,1,2],[2,1,3],[2,2,1],[2,2,2],[2,2,3],[2,3,1],[2,3,2],[2,3,3],
[3,1,1],[3,1,2],[3,1,3],[3,2,1],[3,2,2],[3,2,3],[3,3,1],[3,3,2],[3,3,3],
]
it "returns all permutations for the 2 diensional array provided" do
expect(subject) |> to(eq expected)
end
end
end
:このため
defmodule Permutations do
def of([], accumulator) do
accumulator
end
def of([head | tail], accumulator) do
for item <- head, do: of(tail, accumulator ++ [item])
end
end
私のスペックは次のようになります。その仕様の結果は次のとおりです。
Expected `[[[[1, 1, 1], [1, 1, 2], [1, 1, 3]], [[1, 2, 1], [1, 2, 2],
[1, 2, 3]], [[1, 3, 1], [1, 3, 2], [1, 3, 3]]], [[[2, 1, 1], [2, 1, 2],
[2, 1, 3]], [[2, 2, 1], [2, 2, 2], [2, 2, 3]], [[2, 3, 1], [2, 3, 2],
[2, 3, 3]]], [[[3, 1, 1], [3, 1, 2], [3, 1, 3]], [[3, 2, 1], [3, 2, 2],
[3, 2, 3]], [[3, 3, 1], [3, 3, 2], [3, 3, 3]]]]` to equals (==)
`[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3],
[1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3],
[2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3],
[3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3],
[3, 3, 1], [3, 3, 2], [3, 3, 3]]`, but it doesn't.
ネスティングを防止する方法についてのヒントはありがたいです。残念なことに、アウトプットを平坦化すると、組み合わせの1次グループも削除されました。
'process'関数を共有してください。 – mudasobwa