Ich versuche eine einfache Tail-Rekursion zu verwenden, um alle Permutationen für eine Liste von Listen abzurufen. das Modul sieht wie folgt aus:Permutationen einer 2-dimensionalen Liste in Elixir
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
für Meine spec wie folgt aussieht:
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
Leider, wenn die Rekursion die Arrays von Permutationen abwickelt verschachtelt sind. Das Ergebnis dieser Spezifikation ist:
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.
Ich würde mich über alle Tipps freuen, wie Sie die Verschachtelung verhindern können. Leider hat das Reduzieren der Ausgabe auch die Gruppierung erster Ordnung der Kombinationen entfernt.
Bitte teilen Sie eine "Prozess" -Funktion. – mudasobwa