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}
Pruébalo en línea!
Explicación
¿Cómo funciona estructuralmente el código?
En primer lugar, definimos nuestra función P, con dos parámetros enteros ny k, y le dan un tipo de retorno de Int, con este trozo de código: func P(_ n:Int,_ k:Int)->Int{...}. El truco genial aquí es que le decimos al compilador que ignore los nombres de los parámetros, _seguido de un espacio, que nos ahorra dos bytes cuando llamamos a la función. returnobviamente se usa para devolver el resultado de nuestro ternario anidado que se describe a continuación.
Otro truco que utilicé fue n*k>0, que nos ahorra un par de bytes n>0&&k>0. Si la condición es verdadera (ambos enteros son aún más altos que 0), entonces recurrimos recursivamente a nuestra función con ndecrementado por kcomo nuevo ny kpermanece igual, y sumamos el resultado de P()con ny kdecrementado por 1. Si la condición no es verdadera , devolvemos cualquiera 1o 0dependiendo de si nes igual a k.
¿Cómo funciona el algoritmo recursivo?
Sabemos que el primer elemento de la secuencia es p 0 (0) , por lo que verificamos que ambos enteros sean positivos ( n*k>0). Si no son superiores a 0, verificamos si son iguales ( n==l ?1:0), aquí hay dos casos:
Hay exactamente 1 partición posible, y por lo tanto devolvemos 1, si los enteros son iguales.
No hay particiones si una de ellas ya es 0 y la otra no.
Sin embargo, si ambos son positivos, recurrimos recursivamente Pdos veces, agregando los resultados de P(n-k,k)y P(n-1,k-1). Y volvemos a recorrerlo hasta que nllegue a 0.
* Nota: los espacios no se pueden eliminar.