Tupel Rekursiv

07/23/2015 14:06 The_Dentist#1
Hallo,

Ich hätte mal eine Frage zur rekursiven Erstellung von Tupel(n) aus einem Array.

Ich tue mir extrem schwer bei rekursiven Methoden, weswegen es nett wäre wenn Ihr mir da helfen könntet.

Also gegeben sei ein Array a mit z.B. 127, 3, 7
Ich will jetzt alle Tupel:
127, 127, 127,
127, 127, 3
.
.
.
7, 7, 7 // 27 Möglichkeiten

Mit for schleifen ist sowas ja einfach gelöst, aber wie mache ich das rekursiv? Kann ich das Ganze ähnlich der For-Schleifen lösen und einfach Indizes übergeben und als Abbruchbedingung festlegen, wenn alle Indizes bei 2 angekommen sind?

€dit: Ich habe mich mal an einem Zweier Tupel Rekursiv versucht, dass ist aber mehr durch ausprobieren entstanden, als Verstand. Allerdings gibt der bis jetzt auch nur 3 von 4 Lösungen aus.

07/23/2015 16:07 algernong#2
Meine Idee: Gib der Funktion die Parameter Länge, Elemente und ein Array zum Speichern.
Wenn Länge noch größer ist als 1, erzeuge rekursiv alle Tupel mit eins weniger als Länge. Anschließend dupliziere die erzeugten Tupel um die Anzahl der möglichen Elemente. Füge dann an die ersten Länge^(Anzahl der Elemente) ans Ende immer Länge^((Anzahl der Element)-1) mal ein Element an.

Bei den Elementen 1, 2, 3 und der Länge 3 könnte die Funktion also so vorgehen (-- geben die Rekursionstiefe an):
* Länge ist über 1 -> Rufe erstelleTupel(2, Elemente, Array) auf
--* Länge ist über 1 -> Rufe erstelleTupel(1, Elemente, Array) auf
----* Liefere (1, 0, 0), (2, 0, 0), (3, 0, 0)
--* Dupliziere: (1, 0, 0), (2, 0, 0), (3, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0)
--* Elemente anfügen: (1, 1, 0), (2, 1, 0), (3, 1, 0), (1, 2, 0), (2, 2, 0), (3, 2, 0), (1, 3, 0), (2, 3, 0), (3, 3, 0)
* Dupliziere: (1, 1, 0), (2, 1, 0), (3, 1, 0), (1, 2, 0), (2, 2, 0), (3, 2, 0), (1, 3, 0), (2, 3, 0), (3, 3, 0), (1, 1, 0), (2, 1, 0), (3, 1, 0), (1, 2, 0), (2, 2, 0), (3, 2, 0), (1, 3, 0), (2, 3, 0), (3, 3, 0), (1, 1, 0), (2, 1, 0), (3, 1, 0), (1, 2, 0), (2, 2, 0), (3, 2, 0), (1, 3, 0), (2, 3, 0), (3, 3, 0)
* Elemente anfügen: (1, 1, 1), (2, 1, 1), (3, 1, 1), (1, 2, 1), (2, 2, 1), (3, 2, 1), (1, 3, 1), (2, 3, 1), (3, 3, 1), (1, 1, 2), (2, 1, 2), (3, 1, 2), (1, 2, 2), (2, 2, 2), (3, 2, 2), (1, 3, 2), (2, 3, 2), (3, 3, 2), (1, 1, 3), (2, 1, 3), (3, 1, 3), (1, 2, 3), (2, 2, 3), (3, 2, 3), (1, 3, 3), (2, 3, 3), (3, 3, 3)