programacion XD

40
RECURSIVIDAD

description

mi primer trabajo

Transcript of programacion XD

Page 1: programacion XD

RECURSIVIDAD

Page 2: programacion XD

Se dice que una función es recursiva cuando se llama a si

misma.

No todas la funciones pueden llamarse a si mismas, deben

estar diseñadas especialmente para que sean recursivas,

de otro modo podrían conducir a bucles infinitos, o a que el

programa termine inadecuadamente.

RECURSIVIDAD

Page 3: programacion XD

Cuando se llama a una función, se crea un nuevo juego de

variables locales, de este modo, si la función hace una

llamada a si misma, se guardan sus variables y parámetros.

La nueva instancia de la función trabajará con su propia

copia de las variables locales, cuando esta segunda instancia

de la función retorna, recupera las variables y los

parámetros anteriores y continúa la ejecución en el punto

en que había sido llamada.

RECURSIVIDAD

Page 4: programacion XD

La serie de pasos recursivos debe ser finita, terminando

con un paso base.  

Es decir, a cada paso recursivo se le reduce el número

de pasos que hay que dar para terminar, llegando un

momento en el que no se verifica la condición de paso a la

recursividad.  

NOTA: Toda función recursiva se puede resolver de forma

Iterativa y viceversa

PASO BASE

Page 5: programacion XD

EJEMPLOS DE RECURSIVIDAD

Page 6: programacion XD

Función recursiva para calcular el factorial de un número

entero.

El factorial se simboliza como n!, se lee como "n

factorial", y la definición es:

n! = n * (n-1) * (n-2) * ... * 1

No se puede calcular el factorial de números negativos,

y el factorial de cero es 1, de modo que una función bien

hecha para cálculo de factoriales debería incluir un control

para esos casos:

FACTORIAL

Page 7: programacion XD
Page 8: programacion XD

DE NUMERO ENTERO A BINARIO-En este tipo de conversión

no es necesario usar recursividad.-Se puede usar otros métodos.

Page 9: programacion XD
Page 10: programacion XD

?POR QUE ES RECURSIVO ESTE CASO?

NUMERO ELEVADO A SU EXPONENTE

Page 11: programacion XD
Page 12: programacion XD

Leonardo de Pisa

(c. 1170 - 1250), también

llamado Fibonacci, fue un

matemático italiano, famoso

por la invención de la

sucesión de Fibonacci,

surgida como consecuencia

del estudio del crecimiento de

las poblaciones de conejos, y

por su papel en la

popularización del sistema de

numeración posicional en

base 10 (o decimal) en

Europa.

Fibonacci

Page 13: programacion XD

Resolver la serie de Fibonacci por recursividad0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…

Page 14: programacion XD
Page 15: programacion XD

Johann Carl Friedrich Gauss

(30 de abril de 1777 – 23 de

febrero de 1855), fue un

matemático, astrónomo y físico

alemán.

Cuando tenía 10 años en la

escuela el maestro les manda

como penitencia sumar los

cien primeros números

naturales.

Transcurridos pocos segundos

Gauss levanta la mano y dice

tener la solución: los cien

primeros números naturales

suman 5.050.

Carl Friedrich Gauss

Page 16: programacion XD

¿Cómo lo hizo Gauss? Mentalmente se dio cuenta de

que la suma de dos términos equidistantes era constante:

1 , 2 , 3 , 4 . . . . . . . . 97 , 98 , 99 , 100

1+100 = 2+99 = 3+98 = 4+97 = ... = 101

Con los 100 números se pueden formar 50 pares, de

forma que la solución final viene dada por el producto

101· 50 = 5050

Carl Friedrich Gauss

Page 17: programacion XD

Ingresar un número y calcular su sumatoria

Debe sumarse todos los número que le anteceden

Probar la sumatoria de Gauss

Page 18: programacion XD
Page 19: programacion XD

FUNCIONES

Page 20: programacion XD

Una función es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor.

DEFINICION

Page 21: programacion XD

Esta definición proviene de la definición de función matemática la cual posee un dominio y un rango, es decir un conjunto de valores que puede tomar y un conjunto de valores que puede retornar luego de cualquier operación.

Page 22: programacion XD

Son argumentos de entrada para usarse dentro de la función.

Hay algunos detalles respecto a los argumentos de una función, veamos:

Una función o procedimiento pueden tener una cantidad cualquier de parámetros, es decir pueden tener cero, uno, tres, diez, cien o más parámetros. Aunque habitualmente no suelen tener más de 4 o 5.

Si una función tiene más de un parámetro cada uno de ellos debe ir separado por una coma.

Los argumentos de una función también tienen un tipo y un nombre que los identifica. El tipo del argumento puede ser cualquiera y no tiene relación con el tipo de la función.

¿QUÉ SON LOS PARÁMETROS?

Page 23: programacion XD

Las funciones son utilizadas para descomponer grandes problemas en tareas simples y para implementar operaciones que son comúnmente utilizadas durante un programa y de esta manera reducir la cantidad de código.

¿PARA QUÉ SE USA LAS FUNCIONES?

Page 24: programacion XD

Cuando una función es invocada se le pasa el control a la misma, una vez que esta finalizó con su tarea el control es devuelto al punto desde el cual la función fue llamada.

Page 25: programacion XD

Las funciones, como subalgoritmos que son, tienen una constitución similar a los algoritmos. Por consiguiente, una función constará de:

Cabecera, con la definición de la función. Cuerpo de la función.

DECLARACIÓN DE UNA FUNCIÓN EN C++

Page 26: programacion XD

Dentro del cuerpo de la función estará el bloque de declaraciones y el bloque de instrucciones. Este debe incluir una instrucción mediante la que la función tomará un valor para devolverlo al algoritmo llamador.

Luego de la definición de la "firma" de la función, se define su funcionamiento entre llaves; todo lo que esté dentro de las llaves es parte del cuerpo de la función y éste se ejecuta hasta llegar a la instrucción return.

Page 27: programacion XD

Debes tener en cuenta dos cosas importantes con la sentencia return:

Cualquier instrucción que se encuentre después de la ejecución de return NO será ejecutada. Es común encontrar funciones con múltiples sentencias return al interior de condicionales, pero una vez que el código ejecuta una sentencia return lo que haya de allí hacia abajo no se ejecutará.

El tipo del valor que se retorna en una función debe coincidir con el del tipo declarado a la función, es decir si se declara int, el valor retornado debe ser un número entero.

CONSEJOS ACERCA DE RETURN

Page 28: programacion XD

El nombre de la función debe coincidir

exactamente al momento de invocarla. El orden de los parámetros y el tipo debe coincidir. Invocar una función sigue siendo una sentencia

habitual de C++, así que ésta debe finalizar con ';' como siempre.

El valor retornado por una función puede ser asignado a una variable del mismo tipo.

Una función puede llamar a otra dentro de sí misma o incluso puede ser enviada como parámetro a otra.

DETALLLES PARA INVOCAR FUNCIONES

Page 29: programacion XD

Es la función principal en C++. La diferencia de esta función con otras funciones es que no se necesita llamar a esta función, ya que el compilador de C++ busca la función main y la ejecuta automáticamente.

El return de la función main es cero, que significa que no hay error, pero no se suele colocar.

Todo programa C++ tiene una función llamada main. La función main es el punto de entrada al programa y también el punto de salida.

FUNCIÓN MAIN

Page 30: programacion XD

Bajo ciertas circunstancias se deseará escribir funciones que no regresen valor alguno y para ello podemos declarar a la función como void. La palabra reservada void es utilizada para declarar funciones sin valor de retorno y también para indicar que una función específica no requiere de parámetros.

La función void termina cuando se ejecuta la última sentencia de la función. No necesita return.

FUNCIÓN VOID

Page 31: programacion XD
Page 32: programacion XD

ALGORITMO DE BACKTRACKING

En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema.

Page 33: programacion XD

El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución

Page 34: programacion XD

ALGORITMO DE BACKTRACKING

proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)

variables L: ListaComponentesiniciosi EsSolución (X) entoncesok CIERTOde lo contrariook FALSOL=Candidatos (X)mientras ¬ok ^ ¬Vacía (L) hacerX[i + 1] Cabeza (L); L Resto (L) Backtracking (X, ok) fin mientrasfin sifin

Page 35: programacion XD

ENFOQUESALGORITMO DE BACKTRACKING

Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. la técnica va creando todas las posibles combinaciones de elementos para obtener una solución. su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el tiempo de ejecución.vuelta atrás está muy relacionado con labúsquedas binarias .

Page 36: programacion XD

DISEÑO E IMPLEMENTACIÓNBACKTRACKING

Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una búsqueda en profundidad.

Normalmente, se suele implementar este tipo de algoritmos como un procedimiento recursivo.

La diferencia con la búsqueda en profundidad es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución.

Page 37: programacion XD

Algunas heurísticas son comúnmente usadas para

acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el árbol de búsqueda antes de que se tome la decisión y se llame a la subrutina recursiva.

HEURÍSTICASALGORITMO DE BACKTRACKING

Page 38: programacion XD

EJEMPLOS DE PROBLEMAS COMUNES RESUELTOS USANDO VUELTA ATRÁS

SudokuProblema de los movimientos de

un caballoLas ocho reinas

Page 39: programacion XD

Algoritmo de Backtracking

Page 40: programacion XD

Backtracking Recursivo

Backtracking es una técnica algorítmica que consiste en la resolución de problemas mediante la búsqueda sistemática de soluciones exhaustivas. Comúnmente, esta técnica hace uso de la recursividad, y es importante que domines la implementación de las llamadas recursivas con destreza antes de continuar. Te invitamos a que leas el tutorial: Recursividad: La guía definitiva, y aunque no lo consideres necesario puede que te sean útiles algunos consejos que te ayudarán en la formación como programador.