Um número de campainha ( OEIS A000110 ) é o número de maneiras de particionar um conjunto de n elementos rotulados (distintos). O número 0 da campainha é definido como 1.
Vejamos alguns exemplos (eu uso colchetes para denotar os subconjuntos e chaves para as partições):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Existem muitas maneiras de calcular os números de campainha e você pode usar qualquer um deles. Uma maneira será descrita aqui:
A maneira mais fácil de calcular os números de Bell é usar um triângulo numérico semelhante ao triângulo de Pascal para os coeficientes binomiais. Os números dos sinos aparecem nas bordas do triângulo. Começando com 1, cada nova linha no triângulo é construída tomando a última entrada na linha anterior como a primeira entrada e definindo cada nova entrada para o vizinho esquerdo mais o vizinho superior esquerdo:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Você pode usar indexação 0 ou indexação 1. Se você usar a indexação 0, uma entrada de 3
deve sair 5
, mas deve sair 2
se você usar a indexação 1.
Seu programa deve trabalhar até o número 15 da Bell, emitindo 1382958545
. Em teoria, seu programa deve ser capaz de lidar com números maiores (em outras palavras, não codifique as soluções).
EDIT: você não precisa lidar com uma entrada de 0 (para indexação 0) ou 1 (para indexação 1) porque não é calculada pelo método do triângulo.
Casos de teste (assumindo a indexação 0):
0 -> 1 (OPTIONAL)
1 -> 1
2 -> 2
3 -> 5
4 -> 15
5 -> 52
6 -> 203
7 -> 877
8 -> 4140
9 -> 21147
10 -> 115975
11 -> 678570
12 -> 4213597
13 -> 27644437
14 -> 190899322
15 -> 1382958545
As respostas que usam um método interno (como BellB [n] na Wolfram Language) que produz diretamente números de Bell não serão competitivas.
O código mais curto (em bytes) vence.
3
deve sair 2
. Então, o que a entrada 1
daria com a indexação 1?
3
saída deve5
Seria ouput15
, certo? E com 1-indexação seria de saída5