sexta-feira, 1 de novembro de 2013

Ai, é tão parecido com...

Programamos muito por adaptação de código já feito, por nós ou por outrem. Mais uma razão para que os programas sejam legíveis e modulares. Programamos pois por analogia. Vejamos um exemplo simples. Seja o programa para o cálculo dos inteiros positivos entre 1 e n.
1.def somatorio(n):
2.    """ Calcula a soma dos inteiros positivos de 1 até n."""
3.    soma = 0
4.    for i in range(1,n+1):
5.        soma += i
6.    return soma
Admitamos que nos pedem agora para um programa para o cálculo do número harmónico de ordem n, definido por:
 Que semelhança com o problema anterior? Não consegue ver? E se der a definição do primeiro caso: 
Parece agora evidente que são semelhantes. A única diferença está no termo a somar: i no primeiro caso, 1/i no segundo. Logo:
1.def harmonico(n):
2.    """ Calcula o número harmónico dde ordem n."""
3.    soma = 0
4.    for i in range(1,n+1):
5.        soma += 1/i
6.    return soma
Já está. E se for para calcular o número de Euler, base do logaritmo natural: 
As diferenças estão nos limites do somatório e no termo a somar de cada vez. Mas não é substancialmente diferente, pois não? Na solução é evidente que temos que limitar o ... infinito!
1.import math
2. 
3.def expo(n):
4.    soma = 0
5.    for i in range(0,n+1):
6.        soma += 1/math.factorial(i)
7.    return soma
Estamos a usar a função factorial do módulo math. Mas também não é difícil escrever um programa para o cálculo do factorial. Por definição: 
com o factorial de 0 igual a 1. Podemos usar a analogia com o caso do somatório, sendo que a única diferença é termos um produto em vez de uma soma.
1.def factorial(n):
2.    """ Calcula o factorial de um número."""
3.    fact = 1
4.    for i in range(1,n+1):
5.        fact *= i
6.    return fact
Notar como o caso de zero foi tratado à parte. Regressemos aos exemplos anteriores e pensemos no caso da aproximação do valor do seno (em radianos):
 Como adaptar as soluções anteriores (em particular a do número de Euler? Trivial. Só o termo a somar é que é um pouco mais complexo.
1.import math
2. 
3.def seno(x,n):
4.    soma = 0
5.    for i in range(0,n+1):
6.        soma += (((-1)**i) * x**(2*i+1))/math.factorial(2*i+1)
7.    return soma
Aqui o que há a reter é que não se trata de uma constante mas sim de uma função de uma variável.
That's it!

Sem comentários:

Enviar um comentário