apuntes recur clase 1

19
U. A. G. R. M UNIVERSIDAD AUTONOMA GABRIEL RENE MORENO Facultad Ciencias de la computación Carrera de Sistemas Semestre I/2015 Apuntes 2 : Recursividad. Ing. Mary López N. Apuntes Recur página 1

Upload: mary-lopez

Post on 16-Aug-2015

490 views

Category:

Education


5 download

TRANSCRIPT

Page 1: Apuntes recur clase 1

U. A. G. R. MUNIVERSIDAD AUTONOMA GABRIEL

RENE MORENO

Facultad Ciencias de la computaciónCarrera de Sistemas

Semestre I/2015

Apuntes 2 : Recursividad.

Ing. Mary López N.

Apuntes Recur página 1

Page 2: Apuntes recur clase 1

Caso de Estudio: Series Numéricasa.Ejemplo de una Recursión voidb.Ejemplo de una Función Recursivac.

Fundamentos Teóricos1.

Ejemplos Numéricos: step by step2.

Ejemplos Cadenas de caracteres: step by step3.

Ejemplos con Vectores 4.

Ejemplos con Matrices5.

BIBLIOGRAFIA

Programación en C++ con C++Builder. 1.

Angel A. Zeitoune y Ricardo A. Rettore. 2005

Aprenda C++ Como si estuviera en primero. 2.

García, Rodríguez,Sarriegui y Brazales

Fundamentos de Algoritmia.3.Brassard Bratley

Programación en C++ como si estuviera en primero1.http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/

manualcpp.pdf

WEBGRAFIA

Índice

Apuntes Recur página 2

Page 3: Apuntes recur clase 1

1. Recursividad en la practica

Hay pocos alumnos en la clase. Cuantos asistieron hoy ?

Comienza el del medio diciendo somos los de mi derecha mas los de mi izquierda y yoa.Luego los de la derecha dice somos los de mi izquierda mas los de mi derecha y yob.Así hasta que el ultimo queda solo y dice solo soy yo (1)c.

Cuantos son si se van dividiendo hasta que quedan grupos de 11.

Izquierda ->1 Derecha ->1 Y yo = Todos somos 3a.

Comienzan a devolver 2.

Debe continuar el paso 2 para los grupos sucesivos hasta llegar al primero que dirá los de mi izquierda son M y los de mi derecha son P. En total somos ==> M+1+P

3.

El grupo se divide en dos partes y no se sabe cuantos hay en total.

http://www.grycap.upv.es/gmolto/prg.php

Plantilla: Método para lograr recursiones

recursivos.Comprender el funcionamiento de la pila de activación durante la ejecución del algoritmo recursivo

Entender el algoritmo recursivo.

Encontrar Cómo solucionar el problema . Como lo puedo dividirlo.Análisis del Problema1.

Diseñar el algoritmo2.

Parámetros de entrada•Parámetros de salida•Proceso o Función•

a. Perfil del método

Análisis de Caso base --> Soluciona sin llamarse a si mismo. No tiene llamada recursiva. Con este es posible que el algoritmo sea FINITO.

Análisis del caso general --> Solución de un problema en términos de un problema mas pequeño. Llama a si mismo.

Ecuación de recurrencia.•

b. Análisis de casos

if () //caso baseelse //Caso General

c. Transcripción a c++

Mostrar la pila de activación que se forma por cada llamada recursiva •Sirve para ver que se guarda (dirección de memoria + valor de parámetros)•Aquí se refleja lo que pasa en cada RETURN •

Seguir paso a paso apilando las cajas -

Toca el caso base --> Inicia el des apilado.-

Validación del algoritmo3.

Conclusion4.1. Análisis del Problema2. Diseño del algoritmo.3. Validación.

Objetivo: Comprender el procedimiento para el análisis y diseño de algoritmos

Fundamentos Teóricos1.

Apuntes Recur página 3

Page 4: Apuntes recur clase 1

Series Numéricas

Lo Primero que debe hacer es enumerar posiciones de cada elemento en la serie y reconocerla como una de los siguientes tipos:

3 5 7 9 11 Sucesión Aritmética --> Sumando o restando un valor constante

Luego la fórmula del término Enésimo es:

An=A1 + (n-1)*d

Donde:A1= Es el primer elemento de la serie (3)d = Diferencia del segundo menos el primero (2)

A3=3 + (4-1)*2 =9n = El elemento de la serie a calcular (4)

1 2 4 8 16Sucesión geométrica --> Multiplicando por una razón

Luego la fórmula del término enésimo es:

An=A1 * R(n-1)

Donde:A1= Es el primer elemento de la serie (1)R = Es la razón y es el valor por el que se multiplica para avanzar (2)

A4=1 * 2(4-1)

n = El elemento de la serie a calcular (4)

2 5 10 17 26Sucesión que se factor iza --> Tienen un factor común que comparten.

Luego la fórmula del término enésimo es:

An=(n2 + 1)

Donde:

A2=(22 + 1) n = El elemento de la serie a calcular (2)

Cuadrática an2 +bn +c --> Resulta ser una serie aritmética recién el en segundo nivel .

Si reemplazamos en la fórmula de la cuadrática para n=1 --> a+b+cSi reemplazamos en la fórmula de la cuadrática para n=2 --> 4a+2b+cSi reemplazamos en la fórmula de la cuadrática para n=3--> 9a+3b+c

Caso de Estudio: Series Numéricas

Apuntes Recur página 4

Page 5: Apuntes recur clase 1

Así si la serie es:

4 12 26 46 --> a+b+c =4 --> c=2 8 14 20 --> 3a+b =8 --> b=-1 6 6 --> 2a =6 --> a=3Luego, si reemplaza en la fórmula de la cuadrática obtenemos la fórmula del termino enésimo de la serie.

an2 +bn +c = 3n2 - n +2

Luego, si saca sumatorio obtiene el total de la suma de los N elementos de la serie numerica.

i=n

∑ (3n2 -n +2) --> Algoritmos que suma con ciclo repetitivo.i=1

Serie Cubica: an3 + bn2 +cn +d Resulta ser una serie aritmética recién en el tercer nivel.

2 + 16 + 54 + 128 + ......2000Desafío: Obtenga las formulas de la misma forma que la serie cuadrática

Apuntes Recur página 5

Page 6: Apuntes recur clase 1

2 4 12 24 72

Comprender el procedimiento de métodos recursivos 1.Especificar los casos de análisis de algoritmos recursivos: Caso base y Caso General2.Conocer la validación y terminación de un algoritmo recursivo3.Analizar el algoritmo recursivo del cálculo del término enésimo de una serie.4.

Objetivo:

Análisis del Algoritmo1.2 *2 = 4 (2do) --> par4*3=12 (3ro) --> impar12*2=24 24*3=72

Procesoi.

Entrada: 1)n-> posición término de la serie numéricak-> término enésimo de la serie

Parámetrosii.

Perfil del método: Identificar a.

Serie ( int n, int &k)

Si n=1 --> Este es el caso base , luego K=21)Caso Base : El algoritmo no se llama a si mismo. Permite que el algoritmo termine en algún momento i.

Caso General : El método se llama a si mismoii.

Serie (n,k) i.

2 n=1;

Serie (n-1,k) n>1

Análisis de casosb.

Codificación en C++c.

void serie(int n,int &k)

k=2; if (n==1)

serie(n-1,k);

k=k*2; if ((n % 2 )== 0)

else k=k*3;

else

Diseño del Algoritmo2.

Metodología:

Void: Generar el enésimo de la serieviernes, 28 de marzo de 2014 16:51

Apuntes Recur página 6

Page 7: Apuntes recur clase 1

else k=k*3;

Validación del algoritmo : Observar si termina y resuelve el problemad.

Secuenciación en clase:

Mostrar la pila que se forma por cada llamada recursiva. Esta sirve para ver que ahí se guarda (dirección de memoria + valor del parámetros)

1.

Aquí se refleja lo que pasa en cada RETURN2.Comienza desde el caso base el des Apilado.3.

Apuntes Recur página 7

Page 8: Apuntes recur clase 1

2 4 12 24 72

Comprender el procedimiento de métodos recursivos 1.Especificar los casos de análisis de algoritmos recursivos: Caso base y Caso General2.Conocer la validación y terminación de un algoritmo recursivo3.Analizar el algoritmo recursivo del cálculo del término enésimo de una serie.4.

Objetivo:

Análisis del Algoritmo1.2 *2 = 4 (2do) --> par4*3=12 (3ro) --> impar12*2=24 24*3=72

Funcioni.

Entrada: 1)n-> posición término de la serie numéricaSalida: Retorna un entero que es el enésimo término de la serie2)

Parámetrosii.

Perfil del método: Identificar a.

Int num = Serie ( int n)

Si n=1 --> Este es el caso base , luego K=21)Caso Base : El algoritmo no se llama a si mismo. Permite que el algoritmo termine en algún momento i.

Caso General : El método se llama a si mismoii.

Serie (n) i.

2 n=1;

Serie (n-1) n>1

Análisis de casosb.

Codificación en C++c.

int serie(int n)

return 2; if (n==1)

return (serie(n-1)*2); if ((n % 2 )== 0)

return (serie(n-1)*3); else

else

Diseño del Algoritmo2.

Metodología:

Funcion: Generar el enésimo de la serieviernes, 28 de marzo de 2014 16:51

Apuntes Recur página 8

Page 9: Apuntes recur clase 1

return (serie(n-1)*3); else

Validación del algoritmo : Observar si termina y resuelve el problemad.

Secuenciación en clase:

Mostrar la pila que se forma por cada llamada recursiva. Esta sirve para ver que ahí se guarda (dirección de memoria + valor del parámetros)

1.

Aquí se refleja lo que pasa en cada RETURN2.Comienza desde el caso base el des Apilado.3.

Apuntes Recur página 9

Page 10: Apuntes recur clase 1

Modelo 1 : Recursivo Simple - Factorial de un numero1.

Modelo 2: Recursivo múltiple - Serie de Fibonacci2.

Modelo 3: Recursivo varios casos base - Potencia de un número3.

Modelo 4: Contar los dígitos de un número4.

Modelo 5: Convertir a binario un número 5.

Modelo 6: Segmentar los dígitos pares e impares de un Numero6.

Sumar los dígitos de un número en base 107.

Sumar solo los dígitos pares de un número en base 108.

+6 + 6 --> 2a =6 --> a=3

+ 8 +14 +20 --> 3a+b =8 --> b=-1

3n^2 - n +2

LUEGO Reemplazando en: an^2 + bn + c

Formula del termino enésimo = 3n^2 - n +2

Donde : n es el número de elementoPor ejemplo : Para n=4 => (3 * ( 4^2)) - (1*4) +2 = 46

4 12 26 46 --> a+b+c =4 --> c=2

Generar la siguiente serie numérica9.

Ejemplos Numéricos: step by step

Apuntes Recur página 10

Page 11: Apuntes recur clase 1

Algoritmo del factorial de un numero entero positivo

Comprender el procedimiento de métodos recursivos 1.Especificar los casos de análisis de algoritmos recursivos: Caso base y Caso General2.Conocer la validación y terminación de un algoritmo recursivo3.Analizar el algoritmo recursivo del calculo del factorial4.

Objetivo:

Análisis del Algoritmo1.Para calcular el factorial de 44! = 4 * (4-1)! = 243! = 3 * (3-1)! = 62! = 2 * (2-1)! = 21! = 1 * (1-1)! = 10! = 1

Funcióni.

Entrada: num -> Variable entera1)Tipo de dato que retorna la Función -> Numero entero.2)

Parámetrosii.

Perfil del método: Identificar a.

Int num = Factorial ( int numero)

0! = 1 --> Este es el caso base1)

Caso Base : El algoritmo no se llama a si mismo. Permite que el algoritmo termine en algún momento

i.

Caso General : El método se llama a si mismoii.

Factorial (n) i.

1 n=0 ;

n * factorial (n-1) n>0

Análisis de casosb.

Codificación en C++c.

int factorial(int nro)if(nro==0) return 1;else//int res= nro*factorial(nro-1);//return res;return nro*factorial(nro-1);

Diseño del Algoritmo2.

Metodología:

Modelo 1 : Recursivo Simple - Factorial de un numeroviernes, 28 de marzo de 2014 16:51

Apuntes Recur página 11

Page 12: Apuntes recur clase 1

Validación del algoritmo : Observar si termina y resuelve el problemad.

Secuenciación en clase:

Mostrar la pila que se forma por cada llamada recursiva. Esta sirve para ver que ahí se guarda (dirección de memoria + valor del parámetros)

1.

Aquí se refleja lo que pasa en cada RETURN2.Comienza desde el caso base el des Apilado.3.

Apuntes Recur página 12

Page 13: Apuntes recur clase 1

Algoritmo para encontrar el Nsimo termino de la serie de Fibonacci

Comprender el funcionamiento de la pila de activación durante la ejecución del algoritmo recursivo

1.

Entender el algoritmo recursivo de calculo del Nsimo termino de la serie de Fibonacci

2.

Analizar la gestión de la pila de recursión ante métodos con recursión múltiple que generan un árbol de llamas recursiva.

3.

Objetivo:

Metodología:

Análisis del Algoritmo1.Para calcular el Fibonacci de 5

1 1 2 3 5

Árbol de llamadas recursivas. parte de la raíz

Funcióni.

Entrada -> Numerico Entero1)Tipo de dato que retorna si es Función -> Numerico Entero.2)

Parámetrosii.

Perfil del método: Identificar a.

Int num = Fibonacci ( int numero)

Fibonacci (0) = 1 --> Este es el caso base1)Fibonacci (1) = 1 --> Este es el caso base2)

Caso Base : El algoritmo no se llama a si mismo. Permite que el algoritmo termine en algún momento

i.

Caso General : El método se llama a si mismoii.

Fibonacci (n) 1 n<2 ;

Fibonacci(n-1) + Fibonacci (n-2) n>=2

Análisis de casosb.

Codificación en C++c.

Diseño del Algoritmo2.

Modelo 2: Recursivo múltiple - Serie de Fibonacciviernes, 28 de marzo de 2014 16:51

Apuntes Recur página 13

Page 14: Apuntes recur clase 1

int Fibonacci(int n) if (n<2) return 1; else return Fibonacci(n-1)+Fibonacci(n-2);

Validación del algoritmo : Observar si termina y resuelve el problemad.

3.

4.

Enumerar los registros de activación para entender como acaba cada llamada recursiva.

El primer registro de activación en crearse ES EL ULTMO en terminar •

Secuenciación en clase:

Apuntes Recur página 14

Page 15: Apuntes recur clase 1

El primer registro de activación en crearse ES EL ULTMO en terminar •Se tubo q calcular los demás para encontrar su resultado.•

Apuntes Recur página 15

Page 16: Apuntes recur clase 1

Algoritmo de la potencia de un numero entero positivo

Comprender el procedimiento de métodos recursivos 1.Especificar los casos de análisis de algoritmos recursivos: Caso base y Caso General2.Conocer la validación y terminación de un algoritmo recursivo3.Analizar el algoritmo recursivo del calculo de la potencia de un numero4.

Objetivo:

Análisis del Algoritmo1.

3^0 = 1 0^0=1

1^1 = 1 555551111^1 = 555551111

0^1000=0

3^4 = 3 * 3 * 3 * 3 = 81 --> Multiplicar pos si mismo 4 veces

Tipo: Función o Procesoi.

Tipos de datos que entran1)Tipo de dato que retorna si es Función.2)

Parámetrosii.

Perfil del método: Identificar a.

Int num = Potencia ( int numero, int pot)

x^0 = 1 --> Este es el caso base1)

Caso Base : El algoritmo no se llama a si mismo. Permite que el algoritmo termine en algún momento

i.

Caso General : El método se llama a si mismoii.

Potencia (n,p) 1 pot=0 ;n * Potencia (n,pot-1) pot>0 ;

Análisis de casosb.

Codificación en C++c.

unsigned int Potencia(int num,int pot)

Diseño del Algoritmo2.

Metodología:

Modelo 3: Recursivo varios casos base - Potencia de un Numeroviernes, 28 de marzo de 2014 16:51

Apuntes Recur página 16

Page 17: Apuntes recur clase 1

unsigned int Potencia(int num,int pot)

return 1; if(pot ==0 )

if (pot ==1)return num;elseif(num == 0) return 0;else return num * Potencia(num,pot-1);

else

Validación del algoritmo : Observar si termina y resuelve el problemad.

Graficar la pila de registros de activación para el algoritmo

Secuenciación en clase:

Mostrar la pila que se forma por cada llamada recursiva. Esta sirve para ver que ahí se guarda (dirección de memoria + valor del parámetros)

1.

Aquí se refleja lo que pasa en cada RETURN2.Comienza desde el caso base el des Apilado.3.

Apuntes Recur página 17

Page 18: Apuntes recur clase 1

Algoritmo para obtener contar los dígitos de un numero en base 10

Comprender el procedimiento de métodos recursivos 1.Especificar los casos de análisis de algoritmos recursivos: Caso base y Caso General2.Conocer la validación y terminación de un algoritmo recursivo3.Analizar el algoritmo recursivo para obtener el binario de un numero en base 104.

Objetivo:

Análisis del Algoritmo1.

501 => Cuantos dígitos ?501 / 10 =5050 / 10 =55 / 10 =0 ==> El Numero a dividir es MENOR que 10Se dividió entre el 10 --> 3 veces --> Luego tiene 3 dígitos.

Tipo: Función o Procesoi.

Tipos de datos que entran1)Tipo de dato que retorna si es Función.2)

Parámetrosii.

Perfil del método: Identificar a.

Unsigned Int dig = CuentaDig (unsigned int num)

num < 10 --> Este es el caso base , tiene 1 digito1)

Caso Base : El algoritmo no se llama a si mismo. Permite que el algoritmo termine en algún momento

i.

Caso General : El método se llama a si mismoii.

CuentaDig (num) 1 num<10 ;CuentaDig (num/10) + 1 num>=10 ;

Análisis de casosb.

Codificación en C++c.

int CuentaDig(int num)

return 1; if (num<10)

Diseño del Algoritmo2.

Metodología:

Modelo 4: Contar los dígitos de un númeroviernes, 28 de marzo de 2014 16:51

Apuntes Recur página 18

Page 19: Apuntes recur clase 1

return 1;

int res= CuentaDig(num/10);res=res+1;return res;

else

Este algoritmo se puede hacer mas corto retirando las variables intermedias . En este caso la variable res

int CuentaDig(int num)

return 1; if (num<10)

return CuentaDig(num/10)+1; else

Validación del algoritmo : Observar si termina y resuelve el problemad.

Graficar la pila de registros de activación.

Secuenciación en clase:

Mostrar la pila que se forma por cada llamada recursiva. Esta sirve para ver que ahí se guarda (dirección de memoria + valor del parámetros)

1.

Aquí se refleja lo que pasa en cada RETURN2.Comienza desde el caso base el des Apilado.3.

Apuntes Recur página 19