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 n
e 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>0
poupar 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 n
decrementada de k
como nova n
e k
permanece a mesma, e adicionamos o resultado deP()
com n
e k
decrementada por 1. Se a condição não for verdadeira , retornamos um 1
ou 0
dependendo 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 P
duas 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.