23 de fevereiro de 2010

Recursão - Potência

Olá!

Você lembra das famosas potências? Daquelas do tipo 2³?
Hoje vamos criar duas formas de realizar esse cálculo.
Queremos criar uma função que receba um número inteiro a (base) e outro n (expoente) e retorne o resultado da multiplicação de a por ele mesmo n vezes (ou, de um modo mais fácil, a elevado à n).

Primeiro, vamos pensar numa versão iterativa, utilizando laços de repetição.
Criamos uma variável para guardar o nosso resultado. Assim, para realizar a multiplicação de a por ele mesmo n vezes, podemos realizar com um laço for: E pronto! temos nossa função potencia:

Como já temos nossa versão iterativa, vamos agora pensar na versão recursiva.
Qual seria o caso base da nossa recursão?
Uma linha de raciocínio seria pensar em um a = 2 e n = 3.
2³ = 2 * (2²)
Certo? Pensando assim, podemos continuar:
2³ = 2 * (2²) = 2 * (2 * (2¹)) = 2 * (2 * (2 * (2^0)))
Logo, o nosso caso base é quando o expoente é zero, ou n == 0, que sabemos que o resultado é 1[1]. E nosso passo da recursão é dado por base * potencia(base, expoente - 1).
Colocando assim, temos:
Potencia(a, n) = a * Potencia(a, n - 1).

Pronto! Temos nossa função recursiva!
Obs.: Perceba que a função funciona adotando n >= 0. Não estamos preocupados em tratar exceções como n = -1, por enquanto =)

Eu acho a função recursiva bem mais elegante =P
Mas é isso ai! Apenas mais um exemplo de recursão!

Até a próxima!

[1] Curiosidade: Pra quem não sabe o porque de um número elevado a zero resultar em 1, o processo é esse: x/x = x¹ : x¹ = x1 - 1 = 1. Explicando: Se você tem 2 objetos e quer dividir para 2 pessoas, sabemos que o resultado é 1. Qualquer número dividido por ele mesmo resulta em 1. Logo, por propriedades de potência, quando há divisão de potências de mesma base pode-se manter a base e subtrair os expoentes, resultando em 2^0. =)

6 comentários:

  1. Se alguém um dia duvidar da sua capacidade diga que você tem testemunhas suficientes que dizem o contrário. Parabéns pelo artigo!
    Abraços,

    ResponderExcluir
  2. oisss
    sou aluna de SI e até compreendi direitinho essa parte de recursão. Só q meu professor me pediu pra fazer um função repetitiva que calcule o fatorial de um número... aí o negócio ficou feio... não consigo fazer... será q vc poderia dar uma luz nesse sentido???

    brigadinha desde já!

    ResponderExcluir
  3. Olá! Bom, se precisar de ajuda pode me enviar seu email que eu ajudo como puder =)
    Mas se vc quer uma função iterativa para o fatorial, algumas postagens pra trás eu escrevi uma e coloquei no blog, quando falei sobre laços de repetição!

    ResponderExcluir
  4. Amei a postagem, nem imaginas o quanto foi útil
    pra mim..
    Obrigada ;)

    ResponderExcluir
  5. Gostaria de qual a diferença entre métodos recursivos e não recursivos?

    ResponderExcluir
  6. Seria melhor economizar na chamada da recursão?
    Por exemplo: 2^10 = 2^5 * 2^5, porém, 2^5 = 2^2*2^2* 2, entretanto, 2^2 = 2^1* 2^1, mas 2^1 eu sei que é 2, assim voltou resolvendo as multiplicações empilhadas.


    double power(int x, int n){
    if(n == 0)
    return 1;
    if(n == 1)
    return x;

    double half = power(x,n/2);
    if (n % 2 == 0)
    return half * half;
    return half * half * x;

    }

    ResponderExcluir