recursividad

Embed Size (px)

Citation preview

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Recursividad

    Programacion Avanzada

    15 de abril de 2013

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Contenido

    IntroduccionObjetivosDefinicion y PropiedadesCaso de analisis: factorial

    Algoritmos de tipo dividir para vencerCaso de analisis: Torres de Hanoi

    Algoritmos de rastreo InversoAlgoritmo del Pintor

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Objetivos

    IntroduccionObjetivosDefinicion y PropiedadesCaso de analisis: factorial

    Algoritmos de tipo dividir para vencerCaso de analisis: Torres de Hanoi

    Algoritmos de rastreo InversoAlgoritmo del Pintor

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Objetivos

    Objetivos de la clase

    Mostrar la utilidad de la recursividad a traves del analisisde casos.

    Mostrar diferentes estrategias para resolver problemasutilizando recursividad.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    IntroduccionObjetivosDefinicion y PropiedadesCaso de analisis: factorial

    Algoritmos de tipo dividir para vencerCaso de analisis: Torres de Hanoi

    Algoritmos de rastreo InversoAlgoritmo del Pintor

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Definicion y propiedades

    Definicion

    Una funcion que se llama a si misma se dice que es recursiva.

    Simbolicamente se representa como una composicion Pcompuesta de un conjunto de sentencias S (que puedencontener a P) y P.

    P = [P, S] (1)

    Esta sujetas a una condicion de salida B. En smbolos:

    funcionP = Si B entonces P[S , P], sino finalizar (2)

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Definicion y propiedades

    DefinicionUna funcion que se llama a si misma se dice que es recursiva.

    Simbolicamente se representa como una composicion Pcompuesta de un conjunto de sentencias S (que puedencontener a P) y P.

    P = [P, S] (1)

    Esta sujetas a una condicion de salida B. En smbolos:

    funcionP = Si B entonces P[S , P], sino finalizar (2)

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Definicion y propiedades

    DefinicionUna funcion que se llama a si misma se dice que es recursiva.

    Simbolicamente se representa como una composicion Pcompuesta de un conjunto de sentencias S (que puedencontener a P) y P.

    P = [P, S] (1)

    Esta sujetas a una condicion de salida B. En smbolos:

    funcionP = Si B entonces P[S , P], sino finalizar (2)

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Propiedades

    Se reserva espacio para almacenar el nuevo conjuntocompleto de las nuevas variables.

    Hay variables con valores presentes y pendientes. La profundidad de la recursion debe ser finita, y ademas

    pequena.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Propiedades

    Se reserva espacio para almacenar el nuevo conjuntocompleto de las nuevas variables.

    Hay variables con valores presentes y pendientes.

    La profundidad de la recursion debe ser finita, y ademaspequena.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Propiedades

    Se reserva espacio para almacenar el nuevo conjuntocompleto de las nuevas variables.

    Hay variables con valores presentes y pendientes. La profundidad de la recursion debe ser finita, y ademas

    pequena.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Recursividad directa

    Recursividad directa: la funcion se llama directamente a simisma.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Recursividad directa

    Recursividad directa: la funcion se llama directamente a simisma.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Recursividad IndirectaRecursividad indirecta: la funcion llama a otra funcion y esta asu vez llama a la primera.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Definicion y Propiedades

    Recursividad IndirectaRecursividad indirecta: la funcion llama a otra funcion y esta asu vez llama a la primera.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    IntroduccionObjetivosDefinicion y PropiedadesCaso de analisis: factorial

    Algoritmos de tipo dividir para vencerCaso de analisis: Torres de Hanoi

    Algoritmos de rastreo InversoAlgoritmo del Pintor

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Factorial

    Definicion

    El factorial para todo entero positivo n, es el producto de todoslos numeros enteros positivos desde 1 hasta n:

    n! = 1 2 3 4 ... (n 1) nel factorial de n = 1 es 1! = 1

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Factorial

    DefinicionEl factorial para todo entero positivo n, es el producto de todoslos numeros enteros positivos desde 1 hasta n:

    n! = 1 2 3 4 ... (n 1) nel factorial de n = 1 es 1! = 1

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Factorial

    DefinicionEl factorial para todo entero positivo n, es el producto de todoslos numeros enteros positivos desde 1 hasta n:

    n! = 1 2 3 4 ... (n 1) nel factorial de n = 1 es 1! = 1

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Uso de la recursividad Una solucion recursiva puede no ser la mejor manera de

    resolver el problema.

    Esquemas donde hay solo una llamada a la funcionrecursiva al final o al inicio de la composicion:funcionRecursiva(params){if (B) {S} // S conjunto de sentenciaselse {funcionRecursiva(params)}

    }

    se puede representar por:funcionRecursiva(params){incializar();while(B) {S // S conjunto de sentencias

    }}

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Uso de la recursividad Una solucion recursiva puede no ser la mejor manera de

    resolver el problema. Esquemas donde hay solo una llamada a la funcion

    recursiva al final o al inicio de la composicion:

    funcionRecursiva(params){if (B) {S} // S conjunto de sentenciaselse {funcionRecursiva(params)}

    }

    se puede representar por:funcionRecursiva(params){incializar();while(B) {S // S conjunto de sentencias

    }}

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Uso de la recursividad Una solucion recursiva puede no ser la mejor manera de

    resolver el problema. Esquemas donde hay solo una llamada a la funcion

    recursiva al final o al inicio de la composicion:funcionRecursiva(params){

    if (B) {S} // S conjunto de sentenciaselse {funcionRecursiva(params)}

    }

    se puede representar por:funcionRecursiva(params){incializar();while(B) {S // S conjunto de sentencias

    }}

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Uso de la recursividad Una solucion recursiva puede no ser la mejor manera de

    resolver el problema. Esquemas donde hay solo una llamada a la funcion

    recursiva al final o al inicio de la composicion:funcionRecursiva(params){

    if (B) {S} // S conjunto de sentenciaselse {funcionRecursiva(params)}

    }

    se puede representar por:

    funcionRecursiva(params){incializar();while(B) {S // S conjunto de sentencias

    }}

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: factorial

    Uso de la recursividad Una solucion recursiva puede no ser la mejor manera de

    resolver el problema. Esquemas donde hay solo una llamada a la funcion

    recursiva al final o al inicio de la composicion:funcionRecursiva(params){

    if (B) {S} // S conjunto de sentenciaselse {funcionRecursiva(params)}

    }

    se puede representar por:funcionRecursiva(params){

    incializar();while(B) {S // S conjunto de sentencias

    }}

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    IntroduccionObjetivosDefinicion y PropiedadesCaso de analisis: factorial

    Algoritmos de tipo dividir para vencerCaso de analisis: Torres de Hanoi

    Algoritmos de rastreo InversoAlgoritmo del Pintor

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Torres de Hanoi

    Dadas tres torres A, B y C, con una cantidad de N discosapilados en el torre A.

    Los discos son de diferentes tamanos e inicialmente seencuentran apilados desde el mas grande hasta el maspequeno.

    Se pide lograr que los N discos de la torre A pasen a la Csegun las reglas:

    Solo se puede mover el disco superior de cualquier torre. Un disco mas grande no puede estar encima de uno mas

    pequeno.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Torres de Hanoi

    Dadas tres torres A, B y C, con una cantidad de N discosapilados en el torre A.

    Los discos son de diferentes tamanos e inicialmente seencuentran apilados desde el mas grande hasta el maspequeno.

    Se pide lograr que los N discos de la torre A pasen a la Csegun las reglas:

    Solo se puede mover el disco superior de cualquier torre. Un disco mas grande no puede estar encima de uno mas

    pequeno.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Torres de Hanoi

    Dadas tres torres A, B y C, con una cantidad de N discosapilados en el torre A.

    Los discos son de diferentes tamanos e inicialmente seencuentran apilados desde el mas grande hasta el maspequeno.

    Se pide lograr que los N discos de la torre A pasen a la Csegun las reglas:

    Solo se puede mover el disco superior de cualquier torre. Un disco mas grande no puede estar encima de uno mas

    pequeno.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Torres de Hanoi

    Dadas tres torres A, B y C, con una cantidad de N discosapilados en el torre A.

    Los discos son de diferentes tamanos e inicialmente seencuentran apilados desde el mas grande hasta el maspequeno.

    Se pide lograr que los N discos de la torre A pasen a la Csegun las reglas:

    Solo se puede mover el disco superior de cualquier torre.

    Un disco mas grande no puede estar encima de uno maspequeno.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Torres de Hanoi

    Dadas tres torres A, B y C, con una cantidad de N discosapilados en el torre A.

    Los discos son de diferentes tamanos e inicialmente seencuentran apilados desde el mas grande hasta el maspequeno.

    Se pide lograr que los N discos de la torre A pasen a la Csegun las reglas:

    Solo se puede mover el disco superior de cualquier torre. Un disco mas grande no puede estar encima de uno mas

    pequeno.

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Codigo torres de Hanoi

    void Hanoi(unsigned int nd,char origen,char destino, charauxiliar,ostream& salida){

    if (nd>0){Hanoi(nd-1,origen,auxiliar,destino,salida);salida

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Complejidad

    El analisis de la complejidad tambien se puede pensar enforma recursiva. Por ejemplo para 4 discos, si H(n) es lacantidad de movimientos:

    H(4) = H(3) + 1 + H(3)H(3) = H(2) + 1 + H(2)H(2) = H(1) + 1 + H(1)

    H(1) = 1

    = 15= 7= 3= 1

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Caso de analisis: Torres de Hanoi

    Complejidad

    El analisis de la complejidad tambien se puede pensar enforma recursiva. Por ejemplo para 4 discos, si H(n) es lacantidad de movimientos:

    H(4) = H(3) + 1 + H(3)H(3) = H(2) + 1 + H(2)H(2) = H(1) + 1 + H(1)

    H(1) = 1

    = 15= 7= 3= 1

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Generalidades

    Encontrar solucion a problemas sin seguir una reglaespecfica de calculo, sino por ensayo y error (Busquedaexhaustiva).

    Descomposicion del tanteo: Tareas parciales que se puedan expresar recursivamente. Se explora un numero finito de subtareas: Es util donde hay muchas posibilidades iniciales, pero

    quedan pocas tras aplicar reglas posteriores

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Algoritmo del Pintor

    IntroduccionObjetivosDefinicion y PropiedadesCaso de analisis: factorial

    Algoritmos de tipo dividir para vencerCaso de analisis: Torres de Hanoi

    Algoritmos de rastreo InversoAlgoritmo del Pintor

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Algoritmo del Pintor

    Algoritmo del pintor Iconst int tamanio=300;const int vecinosC[]={-1,0,1,-1,1,-1,0,1};const int vecinosF[]={-1,-1,-1,0,0,1,1,1};

    class figura {protected:vector matriz;int area;void cuenta(int f, int c, int color, vector &mb);public:figura();void CalcularArea(int f0, int c0);int superficie(){return area;}

    };void figura::CalcularArea(int f0,int c0){ vector vb(tamanio,false);

    vector mb(tamanio,vb);area=0;cuenta(f0,c0,matriz[f0][c0],mb);

  • Introduccion Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso

    Algoritmo del Pintor

    Algoritmo del pintor II

    }

    void figura::cuenta(int f, int c, int color, vector &mb)

    { if ((f=0)&&(matriz[f][c]==color)&& !mb[f][c])

    { area++;int vecino=0;mb[f][c]=true;for (vecino=0;vecino