Clase 32

4
RECURSIVIDAD: Suelen responder a funciones que se definen en base a un caso menor de sí mismas. El factorial consiste multiplicar un número por todos los anteriores hasta llegar al 1. De esta manera, por ejemplo, el factorial de 5 es 5×4×3×2×1. Si nos fijamos, 4×3×2×1 es el factorial de 4, es decir F(4), pero además 3×2×1 es el factorial de 3…F(3) y así sucesivamente… Cuando llegamos al 1, F(1) se calcularía como 1 multiplicado por todos los números anteriores al 1 hasta llegar al 1, pero como ya estamos en el 1, F(1)=1, sin multiplicarlo por nada más, Al factorial de 1 le llamaremos “caso base”, y directamente lo definiremos como 1 Diremos que el factorial de un número n es n multiplicado por el factorial del anterior, es decir el factorial de n- 1. Esto vale para todos los números naturales positivos del dos en adelante, pero no para el 1, Hay uno o varios casos de la función que se resuelven directamente. Son los casos base. En el factorial, el caso base es cuando n=1, que directamente decidimos que es 1. El resto de los casos, los definimos en función del un factorial "más pequeño". RESOLVIENDO EL FACTORIAL Programar una función recursiva es sencillo. Observa este método en C# para resolver el factorial. static int Factorial(int n) { int resultado; if (n == 1) //caso base resultado = 1; else //otro caso resultado = n * Factorial(n - 1); return resultado; F(1)=1 F(n)=n×F(n-1) Si n>1

description

estructura

Transcript of Clase 32

Page 1: Clase 32

RECURSIVIDAD:Suelen responder a funciones que se definen en base a un caso menor de sí mismas.

El factorial consiste multiplicar un número por todos los anteriores hasta llegar al 1.

De esta manera, por ejemplo, el factorial de 5 es 5×4×3×2×1. Si nos fijamos, 4×3×2×1 es el factorial de 4, es decir F(4), pero además 3×2×1 es el factorial de 3…F(3) y así sucesivamente… Cuando llegamos al 1, F(1) se calcularía como 1 multiplicado por todos los números anteriores al 1 hasta llegar al 1, pero como ya estamos en el 1, F(1)=1, sin multiplicarlo por nada más, Al factorial de 1 le llamaremos “caso base”, y directamente lo definiremos como 1

Diremos que el factorial de un número n es n multiplicado por el factorial del anterior, es decir el factorial de n-1. Esto vale para todos los números naturales positivos del dos en adelante, pero no para el 1,

Hay uno o varios casos de la función que se resuelven directamente. Son los casos base. En el factorial, el caso base es cuando n=1, que directamente decidimos que es 1. El resto de los casos, los definimos en función del un factorial "más pequeño".

RESOLVIENDO EL FACTORIAL

Programar una función recursiva es sencillo. Observa este método en C# para resolver el factorial.

static int Factorial(int n) { int resultado;  if (n == 1) //caso base resultado = 1; else //otro caso resultado = n * Factorial(n - 1); return resultado; } 

Ahora con una función iterativa

static int FactIterativo(int n) { int resultado=1; for (int i=n;i>=2;i--) { resultado = resultado * i; } return resultado; } 

En la solución recursiva, las variables se crean para cada llamada recursiva.

F(1)=1F(n)=n×F(n-1) Si n>1

Page 2: Clase 32

EL DRAMA DE FIBONACCI

Nuevamente, la definición en términos recursivos de la sucesión de Fibonacci es muy elegante y sencilla de entender:

-El primer y segundo término de la sucesión (n=1 y n=2) es 1-Del tercero en adelante (n>2), es la suma de los dos términos anteriores.

En un lenguaje un poquito más matemático...

fib(1)=1fib(2)=1fib(n)=fib(n-1)+fib(n-2) cuando n>2 

Por ejemplo, el término tercero (n=3) es la suma de los dos casos base, es decir, 2. El cuarto es la suma del tercero (2) y el segundo (1), es decir, 3. El quinto es la suma del cuarto (3) y del tercero (2), es decir, 5... y así sucesivamente.

Sin embargo, computacionalmente hablado, implementar la función de Fibonacci en estos términos recursivos no es tan elegante, aunque pudiera parecerlo.

static int fib(int n) { int resultado; if (n==1) resultado=1; else if(n==2) resultado=1; else resultado=fib(n-1)+fib(n-2); return resultado; } 

Esta función implementa esta solución. (Tomada del artículo Sucesión de Fibonacci)

static int Fibonacci(int n){ if (n < 3) //los dos primeros terminos son 1 return 1; else // a partir del tercero { int a = 1; int b = 1; int contador = 2; int c; do { contador++; //término que calcula esta iteración c = a + b; //calcular término //preparo las variables para la próxima vuelta a = b; b = c; } while (n != contador); return c; } //fin else}

Page 3: Clase 32

Ejercicios con recursividad

1. Programar un algoritmo recursivo que permita hacer la división por restas sucesivas

2. Programar un algoritmo recursivo que permita invertir un número. Ejemplo: Entrada: 123 Salida: 321

3. Programar un algoritmo recursivo que permita sumar los dígitos de un número. Ejemplo: Entrada: 123 Resultado:6

4. Programar un algoritmo recursivo que permita sumar los elementos de un vector.

5. Programar un algoritmo recursivo que calcule el Maximo comun divisor de dos números

int division (int a, int b)    {

if(b > a) return 0;else    return division(a-b, b) + 1;

   }

int invertir (int n)    {

if (n < 10)         //caso base    return n;else    return (n % 10) + invertir (n / 10) * 10;

   }

int sumar_dig (int n)    {

if (n == 0)      //caso base    return n;else    return sumar_dig (n / 10) + (n % 10);

   }

int suma_vec(int v [], int n)    {

if (n == 0)    return v [n];else    return suma_vec(v, n - 1) + v [n];

   }

int sacar_mcd(int a, int b) {        if(b==0)            return a;        else            return sacar_mcd(b, a % b);    }