SlideShare una empresa de Scribd logo
Recursividad con C# (1)<br />El concepto de recursividad es uno de los más complejos y difíciles de entender en la programación orientada a objetos. Lo trataré de explicar con algunas ideas y algún ejemplo.<br />En la vida hay muchos conceptos que se utilizan a si mismos para explicarse. Una rama de un árbol a su vez tiene ramas, que a su vez puede tener ramas y así sucesivamente hasta que aparecen ramas que solo tienen hojas.<br />Al igual que en este ejemplo, muchos algoritmos se explican en términos de sí mismos. Los algoritmos que poseen esta particularidad se denominan recursivos.<br />Al igual que la mayoría de los lenguajes de programación, C# permite definir métodos recursivos. O sea, métodos que se llaman directa o indirectamente a si mismos. Y ahora la gran pregunta que se hacen todos….<br />Cuando y como termina entonces el método recursivo?<br />Ya se que puede parecer un proceso infinito, pero la clave está en que en cada llamada el problema se “simplifica” de tal modo que llegará el momento en que no hará falta llamar nuevamente al método recursivo. Recuerda que la rama tiene ramas, que a su vez tiene ramas… pero llega el momento en que se llega a una rama que solo tiene hojas.<br />Cabe resaltar que la recursividad es una herramienta muy importante en la programación que en muchos casos permite expresar algoritmos de forma simple y legible. Veremos ahora un caso muy simple en que la recursividad hace nuestro trabajo mucho más fácil.<br />1- Factorial de un número<br />Los matemáticos suelen decir que n! = n * (n – 1)! Sin embargo, en programación, dicho de esta manera la solución sería infinita, ya que siempre podemos restar 1 hasta el infinito negativo. Por tanto debemos definir el factorial de un número para los números mayores o iguales que cero. Por tanto, la función factorial es muy fácil de expresar en C# mediante la recursividad. Este sería el código:<br />int Factorial (int n)<br />{<br />         if ((n == 0) || (n == 1))<br />                 return(1);<br />         else<br />                 return(n*Factorial(n-1));<br />}<br />Es importante decir también que todos los métodos recursivos se pueden hacer de forma iterativa, pero a veces el resultado se hace un poco confuso. Por ejemplo, el factorial de un número n también se puede calcular de esta forma:<br />int Factorial (int n)<br />{<br />      fact = 1;<br />      for (int i=2;  i&lt;=n;  i++)<br />            fact = fact * i;<br />      return fact;<br />} <br />Ven como la forma recursiva es mucho más entendible y está basada en la propia definición de Factorial de n.<br />2- Calcular el máximo común divisor de dos números<br />Sean a y b dos números enteros no negativos. Entonces el máximo común divisor (mcd) entre a y b es el mayor entero c, que divide a y b.<br />Hay dos buenos algoritmos para resolver este problema, pero el más eficiente es el algoritmo de Euclides, que descubrió hace más de 2000 años, mucho antes que las computadoras, y lo curioso es que todavía nadie ha encontrado un mejor algoritmo para calcular el mcd de dos números.<br />El algoritmo de Euclides dice:<br />Si a y b son enteros, con a>b (porque si b>a entonces los intercambiamos), entonces el mcd (a,b), es igual al mcd entre a y el resto de la división entre a y b. Traten de demostrarlo!<br />Bueno, vamos ya al código:<br />int MCD (int a, int b)<br />{<br />      if(b==0)<br />            //Caso base, cuando el resto sea 0<br />             return a;<br />      else<br />             //Llamamos pasandole el resto de la división<br />             return MCD (b, a%b);<br />}<br />Recursividad con C# (2)<br />Como lo prometido es deuda, empezaremos esta segunda parte del minicurso de Recursividad en C# con el clásico Hanoi, y luego hablaremos sobre algunas técnicas asociadas al uso de la recursividad, como son “Backtracking” y “Divide y Vencerás”. Además, resolveremos paso a paso varios de los clásicos problemas de recursividad.<br />Según mi profesor de programación (Dr. Miguel Katrib), el juego de las torres de Hanoi es el poder expresivo de la Recursividad, y creo no hay mejor ejemplo que este para empezar a comprender como verdaderamente funciona la recursividad en C#.<br />El juego consiste en ir moviendo discos de la torre original de la izquierda de modo tal que finalmente queden en la misma posición en la torre de la derecha. Los movimientos de los discos deben hacerse bajo las siguientes restricciones: solo podrá moverse un disco a la vez y nunca podrá ubicarse un disco de mayor diametro sobre uno de menor diametro. La torre del centro puede utilizarse de modo auxiliar para el traspaso de los discos.<br />En la imagen de la derecha se muestran los movimientos a realizar para mover 3 discos. ¡Imaginen ahora la cantidad de movimientos a realizar para mover 10 discos! Lo que se quiere es un algoritmo que nos diga los movimientos a efectuar para mover una cantidad “n” de discos.<br />Analicemos ahora el problema:<br />1- Si la cantidad de discos a mover es 1, entonces movemos el disco de la torre de origen a la torre de destino.2- Supongamos que sabemos mover n-1 discos desde la torre de origen hasta la torre auxiliar del centro.3- El tercer paso consiste en mover el disco mayor que ha quedado solo en la torre izquierda hacia la torre de destino.4- Mover esos n -1 discos desde la torre auxiliar (que hace de origen) hacia la torre de la derecha.<br />¿Cómo sabemos mover n-1 discos?<br />Como se podrá notar, este algoritmo se utiliza a si mismo y está basado en el principio de inducción matemática. Además, si no cree que podamos mover n-1 discos, entonces veamos si podemos mover n-2 discos, si tampoco lo cree podemos seguir hasta que tengamos que suponer que sabemos mover 1 disco, lo cual es cierto.<br />El método Mover a continuación escribirá como salida los movimientos a realizar para mover una cierta cantidad de discos que se le indica como primer parámetro. Los restantes parámetros serían los nombres de las torres de origen, auxiliar y destino.<br />De modo que cuando haríamos algo como:<br />La salida sería:<br />Seguro notaste que cada vez que se hace una llamada recursiva, la cantidad de discos que se pasa como primer parámetro disminuye en 1. De modo que en algún momento la cantidad de discos será 1, y entonces ya no se hará más ninguna llamada recursiva y el método Mover sabrá retornar a quién lo llamó.<br />Es C# quien lleva todo este proceso de saber como regresar y quien garantiza que los parámetros tengan los mismos valores que tenían antes de haberse hecho la llamada. Si todavía desconfía del trabajo recursivo, intente manualmente seguir el rastro de una llamada original a mover 4 discos.<br />Estrategia de “Divide y Vencerás”<br />Una estrategia importante en la recursividad es la llamada “Divide y Vencerás”. La implementación de soluciones basadas en esta estrategia no sería posible sin la recursividad. Dar un concepto de esta técnica o estrategia no es tan complicado. Primero veamos un ejemplo.<br />Búsqueda Binaria<br />Considere que los elementos de un array de números enteros están ordenados de menor a mayor, por ejemplo {2, 3, 5, 7, 9, 12, 15, 18, 20}. Se quiere saber si el elemento 17 está en el array.<br />Lo que haremos será buscar el elemento que está en la mitad del array (9 en este caso). Si el elemento que buscamos es igual a este, hemos terminado. De lo contrario, como los elementos del array están ordenados, si el elemento buscado es mayor que el del medio, buscamos a la derecha, si es menor, a la izquierda. En este caso 17 es mayor que 9, y por tanto hay que buscar en {12, 15, 18, 20}. Ahora hacemos lo mismo, en este caso, hay que tomar una decisión, ya que como la cantidad de elementos es par, hay que ver si tomamos como el elemento del centro, el de más a la izquierda o el de más a la derecha (el 15 o el 18). Por ahora lo haremos con el que esté en el centro más a la izquierda (el 15). Como 17 es mayor que 15 buscaremos entonces en {18, 20}. El del medio es el 18. Y como el 18 es mayor que 17, entonces buscaremos en {18}. El elemento medio es el propio 18 que no es igual a 17. Como ya no se puede seguir haciendo subdivisiones, entonces podemos concluir que 17 no está en el array.<br />Por lo que el código sería el siguiente:<br />Note como, además de cumplir las 4 reglas de la recursividad, el método recursivo contiene dos llamadas recursivas que se aplican a dos posibles “divisiones” del problema original. Generalmente se considera que los algoritmos que contienen más de dos llamadas recursivas son algoritmos de “Divide y Vencerás”.<br />Podemos resumir entonces que esta estrategia consta de dos partes.<br />1- La división. Es donde el problema se divide en problemas más pequeños que a su vez re resuelven recursivamente.2- La solución del problema original se forma a partir de estos problemas más pequeños.<br />
Recursividad Con C#
Recursividad Con C#
Recursividad Con C#
Recursividad Con C#
Recursividad Con C#

Más contenido relacionado

La actualidad más candente

Noción de archivo real y virtual
Noción de archivo real y virtual Noción de archivo real y virtual
Noción de archivo real y virtual
Laura Guadalupe Rosado Hernández
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en java
Luis Miguel De Bello
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Giancarlo Aguilar
 
Entrada/Salida de Sistemas Operativos
Entrada/Salida de Sistemas OperativosEntrada/Salida de Sistemas Operativos
Entrada/Salida de Sistemas Operativos
Karina Rivra
 
Teoria de automatas y lenguajes formales
Teoria de automatas y lenguajes formalesTeoria de automatas y lenguajes formales
Teoria de automatas y lenguajes formales
Universidad del Valle
 
Unidad 4 graficación
Unidad 4 graficaciónUnidad 4 graficación
Unidad 4 graficación
Andhy H Palma
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
DĴäîřo Lêmä
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
Andres Justiniano De la Cruz
 
Tópicos Avanzados de Programación - Unidad 3 programacion concurrente
Tópicos Avanzados de Programación - Unidad 3 programacion concurrenteTópicos Avanzados de Programación - Unidad 3 programacion concurrente
Tópicos Avanzados de Programación - Unidad 3 programacion concurrente
José Antonio Sandoval Acosta
 
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Rubi Veronica Chimal Cuxin
 
Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..
NANO-06
 
Tecnicas de Administracion de Memoria
Tecnicas de Administracion de MemoriaTecnicas de Administracion de Memoria
Tecnicas de Administracion de Memoria
Ashley Stronghold Witwicky
 
Modelos de arquitecturas de computadoras
Modelos de arquitecturas de computadorasModelos de arquitecturas de computadoras
Modelos de arquitecturas de computadoras
YESENIA CETINA
 
Estructura Condicional
Estructura CondicionalEstructura Condicional
Estructura CondicionalRegina Flores
 
Estructura de Datos: Pila
Estructura de Datos: PilaEstructura de Datos: Pila
Estructura de Datos: Pila
Emerson Garay
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de Ordenamiento
José Antonio Sandoval Acosta
 
Registros de la cpu
Registros de la cpuRegistros de la cpu
Registros de la cpujomapuga
 
Procesos Ligeros: Hilos o Hebras
Procesos Ligeros: Hilos o HebrasProcesos Ligeros: Hilos o Hebras
Procesos Ligeros: Hilos o Hebras
J M
 

La actualidad más candente (20)

Noción de archivo real y virtual
Noción de archivo real y virtual Noción de archivo real y virtual
Noción de archivo real y virtual
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en java
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.
 
Entrada/Salida de Sistemas Operativos
Entrada/Salida de Sistemas OperativosEntrada/Salida de Sistemas Operativos
Entrada/Salida de Sistemas Operativos
 
Teoria de automatas y lenguajes formales
Teoria de automatas y lenguajes formalesTeoria de automatas y lenguajes formales
Teoria de automatas y lenguajes formales
 
Unidad 4 graficación
Unidad 4 graficaciónUnidad 4 graficación
Unidad 4 graficación
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
 
Tópicos Avanzados de Programación - Unidad 3 programacion concurrente
Tópicos Avanzados de Programación - Unidad 3 programacion concurrenteTópicos Avanzados de Programación - Unidad 3 programacion concurrente
Tópicos Avanzados de Programación - Unidad 3 programacion concurrente
 
Ejercicios
EjerciciosEjercicios
Ejercicios
 
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
 
Ansi c
Ansi cAnsi c
Ansi c
 
Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..
 
Tecnicas de Administracion de Memoria
Tecnicas de Administracion de MemoriaTecnicas de Administracion de Memoria
Tecnicas de Administracion de Memoria
 
Modelos de arquitecturas de computadoras
Modelos de arquitecturas de computadorasModelos de arquitecturas de computadoras
Modelos de arquitecturas de computadoras
 
Estructura Condicional
Estructura CondicionalEstructura Condicional
Estructura Condicional
 
Estructura de Datos: Pila
Estructura de Datos: PilaEstructura de Datos: Pila
Estructura de Datos: Pila
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de Ordenamiento
 
Registros de la cpu
Registros de la cpuRegistros de la cpu
Registros de la cpu
 
Procesos Ligeros: Hilos o Hebras
Procesos Ligeros: Hilos o HebrasProcesos Ligeros: Hilos o Hebras
Procesos Ligeros: Hilos o Hebras
 

Similar a Recursividad Con C#

Matematicas para la Olimpiada
Matematicas para la OlimpiadaMatematicas para la Olimpiada
Matematicas para la OlimpiadaJoemmanuel Ponce
 
Cap1.3
Cap1.3Cap1.3
Los 20 algoritmos matemáticos
Los 20 algoritmos matemáticosLos 20 algoritmos matemáticos
Los 20 algoritmos matemáticosIvan
 
Unidad 1
Unidad 1Unidad 1
Unidad 1Isabel
 
Recursividad
RecursividadRecursividad
Recursividad
Manuela Lopez Cardona
 
recursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxrecursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptx
juan gonzalez
 
recursividad.pptx
recursividad.pptxrecursividad.pptx
recursividad.pptx
juan gonzalez
 
SUMAS EN SYMPY.docx
SUMAS EN SYMPY.docxSUMAS EN SYMPY.docx
SUMAS EN SYMPY.docx
ssuserd2a0fa
 
SUMAS EN SYMPY.docx
SUMAS EN SYMPY.docxSUMAS EN SYMPY.docx
SUMAS EN SYMPY.docx
ssuserd2a0fa
 
Enfoques
EnfoquesEnfoques
Enfoques
Jhoan Tenjo
 
Algoritmo de euclides wikipedia, la enciclopedia libre
Algoritmo de euclides   wikipedia, la enciclopedia libreAlgoritmo de euclides   wikipedia, la enciclopedia libre
Algoritmo de euclides wikipedia, la enciclopedia libre
Luis Flores Elias
 
Divide y Vencerás
Divide y VencerásDivide y Vencerás
Divide y Vencerás
Salvador Fernández Fernández
 
Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretasFrancisco Lambert Obediente
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestroFrancisco Lambert Obediente
 
Solucion 03
Solucion 03Solucion 03
Solucion 03
Solucion 03Solucion 03
Tarea de word
Tarea de wordTarea de word
Tarea de word
abigailhernandez123
 

Similar a Recursividad Con C# (20)

Matematicas para la Olimpiada
Matematicas para la OlimpiadaMatematicas para la Olimpiada
Matematicas para la Olimpiada
 
Cap1.3
Cap1.3Cap1.3
Cap1.3
 
Los 20 algoritmos matemáticos
Los 20 algoritmos matemáticosLos 20 algoritmos matemáticos
Los 20 algoritmos matemáticos
 
Complejidad Computacional
Complejidad ComputacionalComplejidad Computacional
Complejidad Computacional
 
Complejidad
ComplejidadComplejidad
Complejidad
 
Unidad 1
Unidad 1Unidad 1
Unidad 1
 
Recursividad
RecursividadRecursividad
Recursividad
 
recursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxrecursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptx
 
recursividad.pptx
recursividad.pptxrecursividad.pptx
recursividad.pptx
 
SUMAS EN SYMPY.docx
SUMAS EN SYMPY.docxSUMAS EN SYMPY.docx
SUMAS EN SYMPY.docx
 
SUMAS EN SYMPY.docx
SUMAS EN SYMPY.docxSUMAS EN SYMPY.docx
SUMAS EN SYMPY.docx
 
Enfoques
EnfoquesEnfoques
Enfoques
 
Algoritmo de euclides wikipedia, la enciclopedia libre
Algoritmo de euclides   wikipedia, la enciclopedia libreAlgoritmo de euclides   wikipedia, la enciclopedia libre
Algoritmo de euclides wikipedia, la enciclopedia libre
 
Semana 05 software libre maxima
Semana 05 software libre maximaSemana 05 software libre maxima
Semana 05 software libre maxima
 
Divide y Vencerás
Divide y VencerásDivide y Vencerás
Divide y Vencerás
 
Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretas
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestro
 
Solucion 03
Solucion 03Solucion 03
Solucion 03
 
Solucion 03
Solucion 03Solucion 03
Solucion 03
 
Tarea de word
Tarea de wordTarea de word
Tarea de word
 

Más de rezzaca

Método Simplex analitico
Método Simplex analiticoMétodo Simplex analitico
Método Simplex analitico
rezzaca
 
Recopilación y Análisis de Documentos.
Recopilación y Análisis de Documentos.Recopilación y Análisis de Documentos.
Recopilación y Análisis de Documentos.rezzaca
 
El cuestionario
El cuestionarioEl cuestionario
El cuestionariorezzaca
 
Listas c#
Listas c#Listas c#
Listas c#rezzaca
 
Unidad 4 Modelos de Procesos del Software
Unidad 4 Modelos de Procesos del SoftwareUnidad 4 Modelos de Procesos del Software
Unidad 4 Modelos de Procesos del Softwarerezzaca
 
Encuadre de Tópicos Selectos de Programación
Encuadre de Tópicos Selectos de ProgramaciónEncuadre de Tópicos Selectos de Programación
Encuadre de Tópicos Selectos de Programación
rezzaca
 
Encuadre de Estructura de Datos
Encuadre de Estructura de DatosEncuadre de Estructura de Datos
Encuadre de Estructura de Datos
rezzaca
 
Encuadre Programación de Sistemas
Encuadre Programación de SistemasEncuadre Programación de Sistemas
Encuadre Programación de Sistemas
rezzaca
 
Cerradura
CerraduraCerradura
Cerradurarezzaca
 
Metodos Constructor Y Destructor
Metodos Constructor Y DestructorMetodos Constructor Y Destructor
Metodos Constructor Y Destructorrezzaca
 
Simetricas Y Transitivas
Simetricas Y TransitivasSimetricas Y Transitivas
Simetricas Y Transitivasrezzaca
 
U2 2 1 U2 2 2 Conjunto Reflexiba
U2 2 1  U2 2 2  Conjunto ReflexibaU2 2 1  U2 2 2  Conjunto Reflexiba
U2 2 1 U2 2 2 Conjunto Reflexibarezzaca
 
Propiedades De Las Relaciones
Propiedades De Las RelacionesPropiedades De Las Relaciones
Propiedades De Las Relacionesrezzaca
 
Listas en C#
Listas en C#Listas en C#
Listas en C#rezzaca
 
Relaciones Introducción
Relaciones IntroducciónRelaciones Introducción
Relaciones Introducciónrezzaca
 
Evaluacion De Expresiones
Evaluacion De ExpresionesEvaluacion De Expresiones
Evaluacion De Expresionesrezzaca
 
Reglas De Inferencia
Reglas De InferenciaReglas De Inferencia
Reglas De Inferenciarezzaca
 
Inducción Matematica
Inducción MatematicaInducción Matematica
Inducción Matematicarezzaca
 
U1.5 Álgebra Declarativa
U1.5 Álgebra DeclarativaU1.5 Álgebra Declarativa
U1.5 Álgebra Declarativarezzaca
 
Cálculo de predicados
Cálculo de predicadosCálculo de predicados
Cálculo de predicadosrezzaca
 

Más de rezzaca (20)

Método Simplex analitico
Método Simplex analiticoMétodo Simplex analitico
Método Simplex analitico
 
Recopilación y Análisis de Documentos.
Recopilación y Análisis de Documentos.Recopilación y Análisis de Documentos.
Recopilación y Análisis de Documentos.
 
El cuestionario
El cuestionarioEl cuestionario
El cuestionario
 
Listas c#
Listas c#Listas c#
Listas c#
 
Unidad 4 Modelos de Procesos del Software
Unidad 4 Modelos de Procesos del SoftwareUnidad 4 Modelos de Procesos del Software
Unidad 4 Modelos de Procesos del Software
 
Encuadre de Tópicos Selectos de Programación
Encuadre de Tópicos Selectos de ProgramaciónEncuadre de Tópicos Selectos de Programación
Encuadre de Tópicos Selectos de Programación
 
Encuadre de Estructura de Datos
Encuadre de Estructura de DatosEncuadre de Estructura de Datos
Encuadre de Estructura de Datos
 
Encuadre Programación de Sistemas
Encuadre Programación de SistemasEncuadre Programación de Sistemas
Encuadre Programación de Sistemas
 
Cerradura
CerraduraCerradura
Cerradura
 
Metodos Constructor Y Destructor
Metodos Constructor Y DestructorMetodos Constructor Y Destructor
Metodos Constructor Y Destructor
 
Simetricas Y Transitivas
Simetricas Y TransitivasSimetricas Y Transitivas
Simetricas Y Transitivas
 
U2 2 1 U2 2 2 Conjunto Reflexiba
U2 2 1  U2 2 2  Conjunto ReflexibaU2 2 1  U2 2 2  Conjunto Reflexiba
U2 2 1 U2 2 2 Conjunto Reflexiba
 
Propiedades De Las Relaciones
Propiedades De Las RelacionesPropiedades De Las Relaciones
Propiedades De Las Relaciones
 
Listas en C#
Listas en C#Listas en C#
Listas en C#
 
Relaciones Introducción
Relaciones IntroducciónRelaciones Introducción
Relaciones Introducción
 
Evaluacion De Expresiones
Evaluacion De ExpresionesEvaluacion De Expresiones
Evaluacion De Expresiones
 
Reglas De Inferencia
Reglas De InferenciaReglas De Inferencia
Reglas De Inferencia
 
Inducción Matematica
Inducción MatematicaInducción Matematica
Inducción Matematica
 
U1.5 Álgebra Declarativa
U1.5 Álgebra DeclarativaU1.5 Álgebra Declarativa
U1.5 Álgebra Declarativa
 
Cálculo de predicados
Cálculo de predicadosCálculo de predicados
Cálculo de predicados
 

Último

Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Telefónica
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
Luis Enrique Zafra Haro
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
vazquezgarciajesusma
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
vazquezgarciajesusma
 
Ventajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloroVentajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloro
durangense277
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
cj3806354
 
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB  S2. PARA VSATMANUAL DEL DECODIFICADOR DVB  S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
Ing. Julio Iván Mera Casas
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
AlejandraCasallas7
 
proyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusproyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmus
raquelariza02
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
samuelvideos
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
maestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdfmaestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdf
JimmyTejadaSalizar
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
IsabellaRubio6
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
ValeriaAyala48
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 

Último (20)

Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
Ventajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloroVentajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloro
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB  S2. PARA VSATMANUAL DEL DECODIFICADOR DVB  S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
 
proyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusproyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmus
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
maestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdfmaestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdf
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 

Recursividad Con C#

  • 1. Recursividad con C# (1)<br />El concepto de recursividad es uno de los más complejos y difíciles de entender en la programación orientada a objetos. Lo trataré de explicar con algunas ideas y algún ejemplo.<br />En la vida hay muchos conceptos que se utilizan a si mismos para explicarse. Una rama de un árbol a su vez tiene ramas, que a su vez puede tener ramas y así sucesivamente hasta que aparecen ramas que solo tienen hojas.<br />Al igual que en este ejemplo, muchos algoritmos se explican en términos de sí mismos. Los algoritmos que poseen esta particularidad se denominan recursivos.<br />Al igual que la mayoría de los lenguajes de programación, C# permite definir métodos recursivos. O sea, métodos que se llaman directa o indirectamente a si mismos. Y ahora la gran pregunta que se hacen todos….<br />Cuando y como termina entonces el método recursivo?<br />Ya se que puede parecer un proceso infinito, pero la clave está en que en cada llamada el problema se “simplifica” de tal modo que llegará el momento en que no hará falta llamar nuevamente al método recursivo. Recuerda que la rama tiene ramas, que a su vez tiene ramas… pero llega el momento en que se llega a una rama que solo tiene hojas.<br />Cabe resaltar que la recursividad es una herramienta muy importante en la programación que en muchos casos permite expresar algoritmos de forma simple y legible. Veremos ahora un caso muy simple en que la recursividad hace nuestro trabajo mucho más fácil.<br />1- Factorial de un número<br />Los matemáticos suelen decir que n! = n * (n – 1)! Sin embargo, en programación, dicho de esta manera la solución sería infinita, ya que siempre podemos restar 1 hasta el infinito negativo. Por tanto debemos definir el factorial de un número para los números mayores o iguales que cero. Por tanto, la función factorial es muy fácil de expresar en C# mediante la recursividad. Este sería el código:<br />int Factorial (int n)<br />{<br />         if ((n == 0) || (n == 1))<br />                 return(1);<br />         else<br />                 return(n*Factorial(n-1));<br />}<br />Es importante decir también que todos los métodos recursivos se pueden hacer de forma iterativa, pero a veces el resultado se hace un poco confuso. Por ejemplo, el factorial de un número n también se puede calcular de esta forma:<br />int Factorial (int n)<br />{<br />      fact = 1;<br />      for (int i=2;  i&lt;=n;  i++)<br />            fact = fact * i;<br />      return fact;<br />} <br />Ven como la forma recursiva es mucho más entendible y está basada en la propia definición de Factorial de n.<br />2- Calcular el máximo común divisor de dos números<br />Sean a y b dos números enteros no negativos. Entonces el máximo común divisor (mcd) entre a y b es el mayor entero c, que divide a y b.<br />Hay dos buenos algoritmos para resolver este problema, pero el más eficiente es el algoritmo de Euclides, que descubrió hace más de 2000 años, mucho antes que las computadoras, y lo curioso es que todavía nadie ha encontrado un mejor algoritmo para calcular el mcd de dos números.<br />El algoritmo de Euclides dice:<br />Si a y b son enteros, con a>b (porque si b>a entonces los intercambiamos), entonces el mcd (a,b), es igual al mcd entre a y el resto de la división entre a y b. Traten de demostrarlo!<br />Bueno, vamos ya al código:<br />int MCD (int a, int b)<br />{<br />      if(b==0)<br />            //Caso base, cuando el resto sea 0<br />             return a;<br />      else<br />             //Llamamos pasandole el resto de la división<br />             return MCD (b, a%b);<br />}<br />Recursividad con C# (2)<br />Como lo prometido es deuda, empezaremos esta segunda parte del minicurso de Recursividad en C# con el clásico Hanoi, y luego hablaremos sobre algunas técnicas asociadas al uso de la recursividad, como son “Backtracking” y “Divide y Vencerás”. Además, resolveremos paso a paso varios de los clásicos problemas de recursividad.<br />Según mi profesor de programación (Dr. Miguel Katrib), el juego de las torres de Hanoi es el poder expresivo de la Recursividad, y creo no hay mejor ejemplo que este para empezar a comprender como verdaderamente funciona la recursividad en C#.<br />El juego consiste en ir moviendo discos de la torre original de la izquierda de modo tal que finalmente queden en la misma posición en la torre de la derecha. Los movimientos de los discos deben hacerse bajo las siguientes restricciones: solo podrá moverse un disco a la vez y nunca podrá ubicarse un disco de mayor diametro sobre uno de menor diametro. La torre del centro puede utilizarse de modo auxiliar para el traspaso de los discos.<br />En la imagen de la derecha se muestran los movimientos a realizar para mover 3 discos. ¡Imaginen ahora la cantidad de movimientos a realizar para mover 10 discos! Lo que se quiere es un algoritmo que nos diga los movimientos a efectuar para mover una cantidad “n” de discos.<br />Analicemos ahora el problema:<br />1- Si la cantidad de discos a mover es 1, entonces movemos el disco de la torre de origen a la torre de destino.2- Supongamos que sabemos mover n-1 discos desde la torre de origen hasta la torre auxiliar del centro.3- El tercer paso consiste en mover el disco mayor que ha quedado solo en la torre izquierda hacia la torre de destino.4- Mover esos n -1 discos desde la torre auxiliar (que hace de origen) hacia la torre de la derecha.<br />¿Cómo sabemos mover n-1 discos?<br />Como se podrá notar, este algoritmo se utiliza a si mismo y está basado en el principio de inducción matemática. Además, si no cree que podamos mover n-1 discos, entonces veamos si podemos mover n-2 discos, si tampoco lo cree podemos seguir hasta que tengamos que suponer que sabemos mover 1 disco, lo cual es cierto.<br />El método Mover a continuación escribirá como salida los movimientos a realizar para mover una cierta cantidad de discos que se le indica como primer parámetro. Los restantes parámetros serían los nombres de las torres de origen, auxiliar y destino.<br />De modo que cuando haríamos algo como:<br />La salida sería:<br />Seguro notaste que cada vez que se hace una llamada recursiva, la cantidad de discos que se pasa como primer parámetro disminuye en 1. De modo que en algún momento la cantidad de discos será 1, y entonces ya no se hará más ninguna llamada recursiva y el método Mover sabrá retornar a quién lo llamó.<br />Es C# quien lleva todo este proceso de saber como regresar y quien garantiza que los parámetros tengan los mismos valores que tenían antes de haberse hecho la llamada. Si todavía desconfía del trabajo recursivo, intente manualmente seguir el rastro de una llamada original a mover 4 discos.<br />Estrategia de “Divide y Vencerás”<br />Una estrategia importante en la recursividad es la llamada “Divide y Vencerás”. La implementación de soluciones basadas en esta estrategia no sería posible sin la recursividad. Dar un concepto de esta técnica o estrategia no es tan complicado. Primero veamos un ejemplo.<br />Búsqueda Binaria<br />Considere que los elementos de un array de números enteros están ordenados de menor a mayor, por ejemplo {2, 3, 5, 7, 9, 12, 15, 18, 20}. Se quiere saber si el elemento 17 está en el array.<br />Lo que haremos será buscar el elemento que está en la mitad del array (9 en este caso). Si el elemento que buscamos es igual a este, hemos terminado. De lo contrario, como los elementos del array están ordenados, si el elemento buscado es mayor que el del medio, buscamos a la derecha, si es menor, a la izquierda. En este caso 17 es mayor que 9, y por tanto hay que buscar en {12, 15, 18, 20}. Ahora hacemos lo mismo, en este caso, hay que tomar una decisión, ya que como la cantidad de elementos es par, hay que ver si tomamos como el elemento del centro, el de más a la izquierda o el de más a la derecha (el 15 o el 18). Por ahora lo haremos con el que esté en el centro más a la izquierda (el 15). Como 17 es mayor que 15 buscaremos entonces en {18, 20}. El del medio es el 18. Y como el 18 es mayor que 17, entonces buscaremos en {18}. El elemento medio es el propio 18 que no es igual a 17. Como ya no se puede seguir haciendo subdivisiones, entonces podemos concluir que 17 no está en el array.<br />Por lo que el código sería el siguiente:<br />Note como, además de cumplir las 4 reglas de la recursividad, el método recursivo contiene dos llamadas recursivas que se aplican a dos posibles “divisiones” del problema original. Generalmente se considera que los algoritmos que contienen más de dos llamadas recursivas son algoritmos de “Divide y Vencerás”.<br />Podemos resumir entonces que esta estrategia consta de dos partes.<br />1- La división. Es donde el problema se divide en problemas más pequeños que a su vez re resuelven recursivamente.2- La solución del problema original se forma a partir de estos problemas más pequeños.<br />