4 Stimmen

Rekursion zur Ermittlung der Anzahl der verschiedenen Kombinationen von n Personen und k Gruppen

Ich übe gerade Rekursion mit Java und bin auf ein Problem gestoßen. Ich versuche, eine Methode zu erstellen, die ich "Gruppen" nenne und die eine Anzahl von Personen und die Anzahl der Gruppen annimmt und die Anzahl der verschiedenen Kombinationen von Personen und Gruppen zurückgibt. Auch die Reihenfolge der Personen in den Gruppen spielt keine Rolle, ebenso wenig wie die Reihenfolge der Gruppen.

Der Code, den ich bis jetzt habe, lautet:

public long groups(int n, int k) {
    if(k==1) return 1;
    if(k==n) return 1;
    else return groups(n-1, k) + groups(n-1, k-1);
}

Es werden jedoch die falschen Werte zurückgegeben. Die ersten beiden Zeilen sind die Basisfälle, die besagen, dass es nur eine Möglichkeit gibt, die Personen aufzuteilen, wenn es nur eine Gruppe gibt, was Sinn macht. Der andere Fall ist, wenn es genau so viele Personen wie Gruppen gibt, in diesem Fall gibt es nur eine Möglichkeit, sie aufzuteilen, eine Person in jede Gruppe. Die letzte Aussage ist der Punkt, an dem ich glaube, dass ich Probleme habe. Ich würde denken, dass jedes Mal, wenn ein rekursiver Aufruf erfolgt, eine Person herausgenommen werden muss (n ist die Anzahl der Personen, also n-1) und diese Person entweder einer Gruppe (k) beitreten oder eine eigene Gruppe (k-1) bilden kann.

Ich habe gerade ein wenig Mühe herauszufinden, wie Rekursion funktioniert und könnte ein wenig Hilfe gebrauchen.

Das sind die Werte, die ich erwarte:

groups(2,1) = 1
groups(2,2) = 1
groups(3,2) = 3
groups(4,2) = 7
groups(4,3) = 6
groups(5,3) = 25

0 Stimmen

Können Sie bitte Beispiele für erwartete und erhaltene Antworten nennen?

0 Stimmen

Fehlende Behandlung von n < k (Fehler oder Null) und, nur der Vollständigkeit halber, sollten Sie die Eingabewerte überprüfen, das heißt, n y k muss größer als Null sein

0 Stimmen

@mattbasta: "Der Hausaufgaben-Tag, wie auch andere so genannte 'Meta'-Tags, wird jetzt nicht mehr empfohlen. aber, Adam, befolgen Sie bitte die verlinkten Richtlinien für Hausaufgaben, einschließlich der Angabe spezieller Einschränkungen, was Sie bisher versucht haben und welcher spezifische Teil des Problems Sie verwirrt.

4voto

user85421 Punkte 28350

Bei der Umsetzung dieses Teils fehlt noch etwas

... und diese Person kann entweder einer Gruppe beitreten (k) ...

Ich denke, die Person kann "k"-Gruppen beitreten, also muss der Code lauten

    public long groups(int n, int k) {
        if(k==1) return 1;
        if(k==n) return 1;
        else return k * groups(n-1, k) + groups(n-1, k-1);
    }

(es fehlte die Multiplikation mit k )

0 Stimmen

Oh, und ich würde dir eine Stimme geben, aber anscheinend kann ich das erst, wenn ich 15 Rufpunkte habe. Tut mir leid :(

0 Stimmen

Keine Probleme, der Algorithmus zur Lösung der Aufgabe hat mir gefallen, und danke, dass Sie die Antwort akzeptiert haben (ich habe dafür einen gewissen Ruf erhalten)

0voto

Ken Bloom Punkte 54770

Es gibt einen viel einfacheren (schnelleren) Weg, Kombinationen zu berechnen - das ist die Binomialkoeffizient . Ich kann zwar verstehen, dass Ihr Lehrer vielleicht möchte, dass Sie eine rekursive Funktion auf diese Weise schreiben, um sich mit der Rekursion vertraut zu machen, aber Sie können diese Formel zur Kontrolle verwenden.

In Ihrem Fall geben Sie hier die falschen erwarteten Werte an. Was Sie wollen, ist

groups(2,1) = 2
groups(2,2) = 1
groups(3,2) = 3
groups(4,2) = 6
groups(4,3) = 4
groups(5,3) = 10

und der Code, den Sie gepostet haben, ist korrekt, wenn die oben genannten Werte das sind, was er zurückgeben soll.

(Falls nicht, können Sie das Problem vielleicht besser erklären, indem Sie deutlicher darlegen, wie sich das Problem, das Sie lösen, von dem der Binomialkoeffizient .)

0 Stimmen

Nun, meine Aufgabe lautet: "Geben Sie bei n Schülern an, wie viele Möglichkeiten Sie haben, sie in k Gruppen aufzuteilen." Und gibt dann die Werte oben in meiner Frage an.

0 Stimmen

Wenn ich den obigen Code ausführe, erhalte ich außerdem: "groups(2,1): 1 groups(2,2): 1 groups(3,2): 2 groups(4,2): 3 groups(4,3): 3 groups(5,4): 4 groups(5,3): 6", die nicht mit den von Ihnen angegebenen Werten übereinstimmen.

0 Stimmen

@Adam: OK, es gab ein kleines Detail, das mir erst nach meinem Posting aufgefallen ist: Um die von mir angegebenen Werte zu erhalten, muss der Basisfall if(k==1) return 1; müsste sich ändern in if(k==0) return 1 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X