Was ist der beste Weg, um diese rekursive Python-Methode in Java zu übersetzen?

8

In eine andere Frage Ich erhielt eine großartige Antwort, die bestimmte Sätze für das chinesische Postbotenproblem erzeugte.

Die Antwort war:

%Vor%

Dies wird das Wunschergebnis von:

ausgeben %Vor%

Das zeigt wirklich die Ausdruckskraft von Python, denn das ist fast genau so, wie ich den Pseudocode für den Algorithmus schreiben würde. Ich mag besonders die Verwendung von Rendite und die Art, wie Sets als erstklassige Bürger behandelt werden.

Aber da liegt mein Problem.

Was wäre der beste Weg zu:

1.Duplizieren Sie die Funktionalität des Yield-Return-Konstrukts in Java? Wäre es stattdessen besser, eine Liste zu führen und meine Teilergebnisse an diese Liste anzuhängen? Wie würden Sie mit dem Keyword Yield umgehen?

2.Handle den Umgang mit den Sätzen? Ich weiß, dass ich wahrscheinlich eine der Java-Sammlungen verwenden könnte, die implementiert, die die Set-Schnittstelle implementiert und dann Dinge wie removeAll () verwendet, um mir einen Set-Unterschied zu geben. Würdest du das in diesem Fall tun?

Letztendlich möchte ich diese Methode so kurz und direkt wie möglich auf Java reduzieren. Ich denke, der Rückgabetyp der Java-Version dieser Methode wird wahrscheinlich eine Liste von int-Arrays oder etwas ähnliches zurückgeben.

Wie würden Sie mit den obigen Situationen umgehen, wenn Sie diese Methode in Java konvertieren?

    
Community 27.04.2010, 22:12
quelle

3 Antworten

2

Um eine Generatorfunktion in Java zu übersetzen, müssen Sie sie als Iterable + Iterator neu implementieren. Zum Beispiel:

%Vor%

Wird (Warnung: Code wird nicht getestet):

%Vor%

Für die Sets würde ich tatsächlich java.util.HashSet verwenden.

    
panzi 27.04.2010, 22:58
quelle
1

Wahrscheinlich möchten Sie es auf einer JVM ausführen. Warum nicht Scala benutzen?

Ich denke, Sie können den Python-Code in fast die gleiche Art von Code in scala übersetzen. Viel besser als das ausführliche Java-Zeug. Und es ist jvm bytecode am Ende, die leicht in Ihre Java-App einfügen / kooperieren wird.

    
Albert 29.04.2010 07:10
quelle
0

Das ist nicht das, wonach Sie gefragt haben, aber ich wollte es ausprobieren, also hier ist eine Lösung in C # mit LINQ:

%Vor%

Gibt tatsächlich keine Paare zurück, sondern ordnete Listen von ganzen Zahlen an, aber zerhackt sie um zwei, nachdem dies einfach ist. Es ist auch schön zu sehen, dass C # mit der Prägnanz von Python konkurrieren kann.
Testen Sie es:

%Vor%

Und die Ausgabe:

%Vor%

Kredit zu Noldorins Antwort zu einer anderen LINQ-Frage für einige Ideen .

    
tzaman 30.04.2010 23:13
quelle

Tags und Links