Ich habe versucht, eine Implementierung von Heaps Algorithmus in C# schreiben, die nicht richtig funktioniert. Ich versuche, eine Allzweck-Implementierung zu erstellen, die alle Permutationen einer Zeichenfolge findet und sie zu einer Liste hinzufügt.C# Implementierung von Heaps Algorithmus funktioniert nicht
Ich fange wie folgt aus:
List<string> permutations = new List<string>();
GenerateHeapPermutations(3, "ABC", permutations);
foreach (var p in permutations)
{
Console.WriteLine(p);
}
Console.ReadKey();
Und hier ist meine Implementierung:
public static void GenerateHeapPermutations(int n, string s, List<string> sList)
{
if (n == 1)
{
sList.Add(s);
}
else
{
for (int i = 0; i < n - 1; i++)
{
GenerateHeapPermutations(n - 1, s, sList);
if (n % 2 == 0)
{
// swap the positions of two characters
var charArray = s.ToCharArray();
var temp = charArray[i];
charArray[i] = charArray[n - 1];
charArray[n - 1] = temp;
s = new String(charArray);
}
else
{
var charArray = s.ToCharArray();
var temp = charArray[0];
charArray[0] = charArray[n - 1];
charArray[n - 1] = temp;
s = new String(charArray);
}
}
GenerateHeapPermutations(n - 1, s, sList);
}
}
Der Algorithmus hat die richtige Anzahl von Permutationen ergeben (in diesem Fall sechs), aber die Permutationen selbst sind falsch:
ABC BAC CBA
BCA ABC BAC
Ich glaube nicht, dass ich von derabweichen, und ich habe es schwer, dies aufgrund der rekursiven Natur dieses Algorithmus zu debuggen (ziemlich schwierig zu konzipieren).
Kann jemand einen Einblick geben, was das Problem sein könnte?
P.S. Keine Hausaufgaben, nur zum Spaß.
Aus dem Pseudo-Code: 'Verfahren erzeugen (n: ganze Zahl, A : Array von jedem): ', aber Sie haben' GenerateHeapPermutations (int n, String s, Liste sList) '- warum das zusätzliche String-Argument? –
Tim
@Tim er speichert nur die permutierten Zeichenfolgen. – Karthik
Alex, ich habe meinen Code bearbeitet, also werde ich mich nicht wiederholen. –