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();
}
}
{
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();
}
{
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();
}
}
Esta es la web donde aprendí a hacer expresiones lambda recursivas:
http://commanet.blogspot.com/2008/02/recursividad-annima.html