Rápido , 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}
Experimente online!
Explicação
Como o código funciona estruturalmente?
Antes de tudo, definimos nossa função P , com dois parâmetros inteiros ne k, e dar-lhe um tipo de retorno Int, com este pedaço de código: func P(_ n:Int,_ k:Int)->Int{...}. O truque legal aqui é que dizemos ao compilador para ignorar os nomes dos parâmetros, _seguido por um espaço, o que nos salva dois bytes quando chamamos a função. returné obviamente usado para retornar o resultado do nosso ternário aninhado descrito abaixo.
Outro truque que usei foi o de n*k>0poupar alguns bytes n>0&&k>0. Se a condição for verdadeira (ambos os números inteiros ainda são maiores que 0), então recursivamente chamamos nossa função com ndecrementada de kcomo nova ne kpermanece a mesma, e adicionamos o resultado deP() com ne kdecrementada por 1. Se a condição não for verdadeira , retornamos um 1ou 0dependendo se né igual a k.
Como o algoritmo recursivo funciona?
Sabemos que o primeiro elemento da sequência é p 0 (0) e, portanto, verificamos se os dois números inteiros são positivos ( n*k>0). Se não forem maiores que 0, verificamos se são iguais ( n==l ?1:0), sendo dois casos:
Existe exatamente 1 partição possível e, portanto, retornamos 1, se os números inteiros forem iguais.
Não há partições se uma delas já for 0 e a outra não.
No entanto, se ambos forem positivos, chamamos recursivamente Pduas vezes, adicionando os resultados de P(n-k,k)e P(n-1,k-1). E rodamos novamente atén atingir 0.
* Nota: Os espaços não podem ser removidos.