Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

viernes, 15 de julio de 2011

Calculando la potencia de un número usando recursividad en C#

Primero, el código fuente:

    class Potencia
    {
        static void Main(string[] args)
        {
            Potencia pot = new Potencia();
            double r = pot.potenciaR(2, 1, 3, 0);
            Console.WriteLine(r.ToString());
            Console.Read();
        }

        private double potenciaR(double base0, double p, int exponente, int i)
        {
            return i >= exponente ? p : potenciaR(base0, p * base0, exponente, i + 1);
        }
    }

Los parámetros de la función "potenciaR" son: base, resultado, exponente, condición de parada.
El parámetro "p" debe ser 1 al inicio porque es el "acumulador" dodne se irá multiplicando la base tantas veces como indique el exponente. La función "potenciaR" deja de llamarse a sí misma cuando el parámetro "i" es igual al valor "exponente". El valor inicial de "i" es cero.

Y a continuación, lo mismo, pero con una expresión lambda recursiva:

class Potencia
    {
        static void Main(string[] args)
        {
            Func<double, double, double,double, double> potenciaF = null;
            potenciaF = (base0, p, exponente, i) =>
                    i >= exponente ? p : potenciaF(base0, p * base0, exponente, i + 1);

            Console.WriteLine(potenciaF(2, 1, 3, 0).ToString());
            Console.Read();
        }      
    }

Releyendo, noté que podemos suprimir el parámetro "i" y usar el mismo parámetro "exponente" como condición de parada. Para la expresión lambda recursiva queda así:

class Potencia
    {
        static void Main(string[] args)
        {
            Func<double, double, double, double> potenciaF = null;
            potenciaF = (base0, p, exponente) =>
                    exponente <= 0 ? p : potenciaF(base0, p * base0, exponente - 1);

            Console.WriteLine(potenciaF(2, 1, 3).ToString());
            Console.Read();
        }
    }

En todos los casos, el parámetro "p" es siempre 1.

Esta es la web donde aprendí a hacer expresiones lambda recursivas:
http://commanet.blogspot.com/2008/02/recursividad-annima.html