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 n
y 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. return
obviamente 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 n
decrementado por k
como nuevo n
y k
permanece igual, y sumamos el resultado de P()
con n
y k
decrementado por 1. Si la condición no es verdadera , devolvemos cualquiera 1
o 0
dependiendo de si n
es 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 P
dos veces, agregando los resultados de P(n-k,k)
y P(n-1,k-1)
. Y volvemos a recorrerlo hasta que n
llegue a 0.
* Nota: los espacios no se pueden eliminar.