Kreuz Produkt von Sets mit Rekursion

Ich schrieb die folgende rekursive Routine, um Kreuzprodukt von zwei Sätzen zu berechnen.

def combine(input1,input2,output): if len(input2)==0: return output else: for num in input1: output.append((num,input2[0])) combine(input1,input2[1:],output) input1=[1 2 5] input2=[2 3] output=[(1,2), (1,3), (2,2),(2,3),(5,2),(5,3)] 

Ist es möglich, die Rekursion besser zu machen, zum Beispiel das Entfernen der Schleife in anderen und versuchen, in der gleichen Funktion zu tun. Ich bin auf der Suche nach verschiedenen Möglichkeiten zur Lösung des Problems.

Bearbeiten: Nicht auf der Suche nach einer Lösung mit etwas eingebautem Auf der Suche nach wie kann ich Rekursion anders machen und nicht itertools.product verwenden.

2 Solutions collect form web for “Kreuz Produkt von Sets mit Rekursion”

Die einfachste rekursive Definition des kartesischen Produktes, das ich mir vorstellen kann, sieht so aus. Du siehst das wie deine, das hat eine Schleife – eigentlich sind zwei Loops in ein Listenverständnis eingebettet. Im Gegensatz zu Ihren, kann dies zwei oder mehr Sequenzen behandeln:

 def product(*seqs): if not seqs: return [[]] else: return [[x] + p for x in seqs[0] for p in product(*seqs[1:])] 

Hier ist ein Spaziergang, um Ihnen ein Gefühl dafür zu geben, wie es funktioniert. Definitionsgemäß ist das kartesische Produkt einer leeren Sequenz ( product() ) eine Sequenz, die die leere Sequenz enthält. Mit anderen Worten, product() == [[]] – siehe hierfür warum.

Nun sagen wir, wir nennen das product([1, 2, 3])seqs ist nicht leer, so dass der Rückgabewert das Ergebnis des Listenverständnisses ist. In diesem Fall ist das product(*seqs[1:]) == product(*[]) == product() == [[]] , so dass das Listenverständnis gleichbedeutend ist:

 [[x] + p for x in seqs[0] for p in [[]] ] 

Das ist gleichbedeutend mit all diesen:

 [[x] + [] for x in seqs[0]] [[x] for x in seqs[0]] [[1], [2], [3]] 

Wenn wir eine andere Sequenz hinzufügen, haben wir product([4, 5, 6], [1, 2, 3]) . Jetzt sieht das Listenverständnis so aus:

 [[x] + p for x in [4, 5, 6] for p in product(*seqs[1:])] [[x] + p for x in [4, 5, 6] for p in [[1], [2], [3]]] [[4, 1], [4, 2], [4, 3], [5, 1], [5, 2], [5, 3], [6, 1], [6, 2], [6, 3]] 

Das Muster fährt von dort fort; Für jede weitere Sequenz wird jeder der Werte in der Sequenz jedem der Werte im kartesischen Produkt der folgenden Sequenzen vorangestellt.

Verwenden Sie itertools

 import itertools print list(itertools.product(input1, input2)) 

Semantisch entspricht dies:

 for i_1 in input_1: for i_2 in input_2: for i_3 in input_3: ... for i_n in input_n: #do something with i_1, i_2, i_3, ..., i_n 

Wo n ist die Anzahl der Argumente, die Sie an product .

  • Python-Rekursions-Permutationen
  • Python - Eigenschaftseinstellung aus der Liste verursacht maximale Rekursionstiefe überschritten
  • Lock-Kombinationen für dynamische Sperrgröße
  • Iteration in Rekursion umwandeln
  • Rekursionsfunktion funktioniert nicht richtig
  • Python max Rekursion, Frage über sys.setrecursionlimit ()
  • Python recursion return Keine Typ
  • N-Queen-Backtracking in Python: Wie gibt man Lösungen zurück, anstatt sie zu drucken?
  • Warum gibt meine rekursive Funktion keine?
  • Python Recursive Funktion fehlende Ergebnisse
  • Maximales Niveau der Rekursion in Python
  • Python ist die beste Programmiersprache der Welt.