Considere o seguinte problema: de quantas maneiras diferentes podemos distribuir 5 bolas para 3 meninos de forma que a soma do número de bol...
Considere o seguinte problema: de quantas maneiras diferentes podemos distribuir 5 bolas para 3 meninos de forma que a soma do número de bolas seja sempre 5? A resposta é facilmente determinada por força bruta (fazendo uma contagem ou usando o programa que disponibilizo aqui.) Mas o problema real é: como resolver a questão para qualquer número de bolas e qualquer número de crianças? A nossa solução é demonstrável?
Um colega de trabalho (Emerson) achou um post em um blog com um comentário que o levou a pensar no problema apresentado no caput desta matéria. Pesquisou e não encontrando uma fórmula que diretamente (no domínio da análise combinatória) resolvesse a missiva.
Para atacar o problema pela força bruta temos o seguinte algoritmo (em BASIC):
Onde n é o número de bolas a serem distribuídas. Caso fossem 4 meninos o programa seria o seguinte:
A solução encontrada (se você quiser tentar fazer e não se contaminar, pare de ler aqui).
Para n bolas e p meninos temos:
Q n,p = 1, se p = 1.
Q n,p = p, se n = 1.
Q n,p = Q n,p-1 + Q n-1,p
Essa fórmula aborda o problema recursivamente, isto é, temos a função definida em termos dela mesma. Existe outra maneira? Alguém se habilita a demonstrar?
Fica o desafio (e um bom problema para as estudantes de matemática e computação).
Função recursiva:
Atualização:
Baseado na solução apontada por outro colega (Valter), temos a seguinte representação:

podemos ter o seguinte algoritmo:
Um colega de trabalho (Emerson) achou um post em um blog com um comentário que o levou a pensar no problema apresentado no caput desta matéria. Pesquisou e não encontrando uma fórmula que diretamente (no domínio da análise combinatória) resolvesse a missiva.
Para atacar o problema pela força bruta temos o seguinte algoritmo (em BASIC):
Function q3(n)
Dim n1, n2, n3, n4, c
For n1 = 0 To n
For n2 = 0 To n
For n3 = 0 To n
If n1 + n2 + n3 = n Then
c = c + 1
End If
Next
Next
Next
q3 = c
End Function
Onde n é o número de bolas a serem distribuídas. Caso fossem 4 meninos o programa seria o seguinte:
Function q4(n)
Dim n1, n2, n3, n4, c
For n1 = 0 To n
For n2 = 0 To n
For n3 = 0 To n
For n4 = 0 To n
If n1 + n2 + n3 + n4 = n Then
c = c + 1
End If
Next
Next
Next
Next
q4 = c
End Function
A solução encontrada (se você quiser tentar fazer e não se contaminar, pare de ler aqui).
Para n bolas e p meninos temos:
Q n,p = 1, se p = 1.
Q n,p = p, se n = 1.
Q n,p = Q n,p-1 + Q n-1,p
Essa fórmula aborda o problema recursivamente, isto é, temos a função definida em termos dela mesma. Existe outra maneira? Alguém se habilita a demonstrar?
Fica o desafio (e um bom problema para as estudantes de matemática e computação).
Função recursiva:
Function q(n, p)
If p = 1 Then
q = 1
Else
If n = 1 Then
q = p
Else
q = q(n - 1, p) + q(n, p - 1)
End If
End If
End Function
Atualização:
Baseado na solução apontada por outro colega (Valter), temos a seguinte representação:

podemos ter o seguinte algoritmo:
Function S(n, p)
Dim n1, n2, n3, n4, c, x
For x = 1 To n
If p = 1 Then
S = 1
Else
If x = 1 Then
S = p
Else
S = S + S(x, p - 1)
End If
End If
Next
End Function