Swift , 76 73 Bytes
func P(_ n:Int,_ k:Int)->Int{return n*k>0 ?P(n-k,k)+P(n-1,k-1):n==k ?1:0}
Probieren Sie es online aus!
Erläuterung
Wie funktioniert der Code strukturell?
Zunächst definieren wir unsere Funktion P
mit zwei ganzzahligen Parametern n
und k
geben ihr Int
mit diesem Code einen Rückgabetyp : func P(_ n:Int,_ k:Int)->Int{...}
. Der coole Trick dabei ist, dass wir den Compiler anweisen, die Namen der Parameter zu ignorieren, _
gefolgt von einem Leerzeichen, das uns beim Aufrufen der Funktion zwei Bytes spart. return
wird offensichtlich verwendet, um das Ergebnis unseres unten beschriebenen verschachtelten Ternärs zurückzugeben.
Ein weiterer Trick, den ich verwendet habe, war n*k>0
, der uns ein paar Bytes mehr erspart n>0&&k>0
. Wenn die Bedingung wahr ist (beide Ganzzahlen sind immer noch höher als 0
), rufen wir unsere Funktion rekursiv mit n
dekrementiert von k
als unsere neue auf n
und k
bleiben gleich, und wir addieren das Ergebnis von P()
mit n
und k
dekrementiert um 1. Wenn die Bedingung nicht wahr ist geben wir entweder 1
oder 0
abhängig davon zurück, ob n
gleich ist k
.
Wie funktioniert der rekursive Algorithmus?
Wir wissen, dass das erste Element der Sequenz p 0 (0) ist , und überprüfen daher, ob beide ganzen Zahlen positiv sind ( n*k>0
). Wenn sie nicht höher als 0 sind, prüfen wir, ob sie gleich sind ( n==l ?1:0
). Hier sind zwei Fälle:
Es gibt genau 1 mögliche Partition, und daher geben wir 1 zurück, wenn die ganzen Zahlen gleich sind.
Es gibt keine Partitionen, wenn eine bereits 0 ist und die andere nicht.
Wenn jedoch beide positiv sind, rufen wir P
zweimal rekursiv auf und addieren die Ergebnisse von P(n-k,k)
und P(n-1,k-1)
. Und wir schleifen erneut, bis n
0 erreicht ist.
* Hinweis: Die Leerzeichen können nicht entfernt werden.