Laden...

Heaps Algorithmus

Erstellt von Kikolo vor 2 Jahren Letzter Beitrag vor 2 Jahren 395 Views
K
Kikolo Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren
Heaps Algorithmus

Guten Morgen,
Ich möchtes den oben genannten Algorithmus in c# implementieren. Den pseudocode habe ich auf Wikipedia gefunden. Nachdem ich keine Lösung gefunden habe habe ich gegoogelt.



public static IEnumerable<IEnumerable<T>> Permute<T>(this IList<T> v)
{
    ICollection<IList<T>> result = new List<IList<T>>();

    Permute(v, v.Count, result);

    return result;
}

private static void Permute<T>(IList<T> v, int n, ICollection<IList<T>> result)
{
    if (n == 1)
    {
        result.Add(new List<T>(v));
    }
    else
    {
        for (var i = 0; i < n; i++)
        {
            Permute(v, n - 1, result);
            Swap(v, n % 2 == 1 ? 0 : i, n - 1);
        }
    }
}

private static void Swap<T>(IList<T> v, int i, int j)
{
    var t = v[i];
    v[i] = v[j];
    v[j] = t;
}


Könnte das vielleicht jemand Zeile für Zeile mit mir durchgehen? Ich verstehe nicht genau was es mit den typparametern auf sich hat. Es wirkt auf mich wie generics aber so ganz fällt der Groschen nicht. Irgendwie sitze ich einfach auf dem Schlauch was genau da passiert.
Kann mir jemand helfen?

J
61 Beiträge seit 2020
vor 2 Jahren

Setze einen Breakpoint in der Erweiterungsfunktion Permute, dann erstelle eine Liste mit mehreren Elementen, rufe damit Permute auf und erfreue dich am Debugger, der alles Schritt für Schritt mit dir durchgeht.

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

K
Kikolo Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren

Du hast die Methode „erweiterungsfunktion“ genannt. Ich dachte eigentlich es sei eine generische Methode? Oder eine generische Erweiterungsmethode also eine Kombination aus einer generischen Methode und einer Erweiterungsmethode. Stimmst du mir da zu oder ist mein Eindruck falsch?

L
11 Beiträge seit 2019
vor 2 Jahren

Hallo Kikolo,

alle deiner Methoden sind generisch, zu erkennen am Typparameter T. Zusätzlich ist die Methode public static IEnumerable<IEnumerable<T>> Permute<T>(this IList<T> v) eine Erweiterungsmethode, zu erkennen am this vor dem ersten Parameter. Das bedeutet, dass sie wie eine Methode des Typs, den du erweiterst (hier ILIst<T>), aufgerufen werden kann. Weitere Informationen dazu findest du auch in der Doku https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods (Docs)

463 Beiträge seit 2009
vor 2 Jahren

Evtl. wäre hier ein Studium der Grundlagen sehr hilfreich - ohne diese wirst du keine Freude an C# haben...

[FAQ] Wie finde ich den Einstieg in C#?
[Hinweis] Bitte schau in die SDK-/MSDN-Doku