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.
def somatorio(n):
    """ Calcula a soma dos inteiros positivos de 1 até n."""
    soma = 0 
    for i in range(1,n+1):
        soma += i
    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:
def harmonico(n):
    """ Calcula o número harmónico dde ordem n."""
    soma = 0
    for i in range(1,n+1):
        soma += 1/i
    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!
import math

def expo(n):
    soma = 0 
    for i in range(0,n+1):
        soma += 1/math.factorial(i)
    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.
def factorial(n):
    """ Calcula o factorial de um número."""
    fact = 1
    for i in range(1,n+1):
        fact *= i
    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.
import math

def seno(x,n):
    soma = 0 
    for i in range(0,n+1):
        soma += (((-1)**i) * x**(2*i+1))/math.factorial(2*i+1)
    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