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 Pmit zwei ganzzahligen Parametern nund kgeben ihr Intmit 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. returnwird 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 ndekrementiert von kals unsere neue auf nund kbleiben gleich, und wir addieren das Ergebnis von P()mit nund kdekrementiert um 1. Wenn die Bedingung nicht wahr ist geben wir entweder 1oder 0abhängig davon zurück, ob ngleich 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 Pzweimal rekursiv auf und addieren die Ergebnisse von P(n-k,k)und P(n-1,k-1). Und wir schleifen erneut, bis n0 erreicht ist.
* Hinweis: Die Leerzeichen können nicht entfernt werden.