Können Sie erklären, diese rekursive "n wählen k" - code für mich?
Hier ist der code, um eine Teilmenge problem mit Argumente n und k. n stellt die Gesamtzahl der Studierenden und k repräsentiert die Menge der Studenten, die ich will, um aus der n. Der code versucht die Anzahl der möglichen Kombinationen von ziehen k Anzahl der Studierenden aus n Anzahl der Studierenden.
def subset(n, k):
if k == 0:
return 1
if n == k:
return 1
else:
return subset(n-1, k-1) + subset(n-1, k)
Ich verstehe den ersten Teil des rekursiven Aufrufs, aber ich habe Schwierigkeiten zu verstehen, die + Teilmenge(n-1, k) Teil. Kann jemand erklären mir das an?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Rekursion basiert auf einer einfachen Beobachtung, für die ich geben eine kombinatorische argument, warum es ist wahr, eher als eine mathematische Beweise durch Formeln.
Wann immer Sie wählen
k
Elemente ausn
gibt es zwei Fälle:#n
#n
Da diese Ereignisse sich gegenseitig ausschließen, die Summe der Kombinationen ist gegeben durch die Menge der Kombinationen bei der Auswahl
#n
, und diejenigen, die, wenn Sie nicht wählen#n
.Wahl element
#n
Da haben wir schon gewählt, ein element, wir brauchen nur wählen Sie eine andere
k-1
Elemente. Auch, da wir beschlossen haben, auf ein element – ob es enthalten ist oder nicht – schon, wir müssen uns nur überlegen, die restlichenn-1
Elemente.Damit, die Menge von Kombinationen für die Auswahl element
#n
ist gegeben durchNicht auswählen element
#n
Gibt es noch
k
Elemente zu wählen, da wir aber bereits unsere Meinung über element#n
es bleiben nurn - 1
Elemente zur Auswahl. Also:Die base-case -
Die Rekursion nutzt die Tatsache, dass wir in der Regel unterscheiden zwischen zwei Situationen, Lösungen, wo element
n
ist Teil der Lösung, und diejenigen, wo es nicht ist.Jedoch eine solche Unterscheidung nicht immer gemacht werden:
n == k
im code unten)k == 0
im code unten)In diesen Fällen gibt es nur genau eine Lösung, damit
Dass es funktioniert
Zu tun, müssen wir uns selbst davon überzeugen (oder zu beweisen), dass die base-case-ist immer der hit bei einem gewissen Punkt.
Lassen Sie uns davon ausgehen, dass
n < k
irgendwann. Da nach unserer Annahmen
war ursprünglich größer oder gleichk
es muss wurden einige Punkt, won = k
, weiln
undk
Rückgang im unisono oder nurn
verringert sich um eins, d.h. es folgtImpliziert dies, dass es gewesen sein muss, einen Anruf zu
subset(n - 1, k)
es passieren, dassn
nimmt unterhalbk
. Dies ist jedoch nicht möglich, da haben wir eine Basis Fall aufn = k
wo wir wieder eine Konstante1
.Schließen wir, dass entweder
n
sinkt irgendwann so, dassn = k
oder zu verringern, im Einklang genauk
mal so, dassk = 0
.So, die base-case funktioniert.
Dies ist mehr ein mathematisches problem und nicht eine Frage der Programmierung. Was Sie tun, ist die Berechnung der Binomial-Koeffizienten, die Formel ist
Finden Sie hier für eine vollständige Erklärung. Eine rekursive Lösung gesehen werden kann hier. Bei dem genannten link geht ungültige such einfach mit Google. Ich bezweifle, dass Sie eine bessere Erklärung, als nach dem Lesen dieses Artikels auf Wikipedia.
Code-fragment:
verwendet zwei kombinatorische Fakten:
als Basis Fällen.
Nächsten, folgenden rekursiven aufrufen:
direkt übersetzt die folgende Tatsache in den code:
Wenn Sie Schwierigkeiten haben, zu verstehen, wie obige Gleichung gilt, dann Lesen Sie weiter:
In nCr, wählen wir r Elemente aus n. Die Entscheidungen können klassifiziert werden in zwei sich gegenseitig ausschließende Klassen, wenn wir betrachten ein bestimmtes Objekt:
Element tritt unter r ausgewählt
In diesem Fall müssen wir wählen, die restlichen r-1 Elemente aus den verbleibenden n-1 Elemente. Dies kann man in (n-1)C(k-1).
Element nicht auftreten, unter r ausgewählt
In diesem Fall haben wir zu wählen, alle von r Elementen aus den verbleibenden n-1 Elemente, die getan werden kann (n-1)Ck Möglichkeiten.
Fügen wir diese beiden, wie ich bereits sagte, diese beiden Klassen sich gegenseitig ausschließen und daher zusammen bildet die gesamten Möglichkeiten der Auswahl von r Elementen aus n.