Anda di halaman 1dari 20

RECURSIVIDAD

PROGRAMACION III- ING DE SISTEMAS UFPS

14/11/2006

Ing. Marco A. Adarme J.

Recursividad
En forma muy simple, un problema es recursivo, si su solucin pasa por autoejecutarse (con otros parmetros).

En el cuerpo de sentencias del mtodo se invoca el mismo es una versin ms pequea del problema original. Un ejemplo de recursividad?
Contar a un grupo de personas...

14/11/2006

Ing. Marco A. Adarme J.

Recursividad...Ejemplo
Contar a un grupo de personas...
Solucin NO recursiva...
Los ponemos en fila, y partiendo del primero, contamos secuencialmente
1, 2, 3, 4, 5, 6, ...., n

Solucin recursiva.
Si no hay nadie, entonces hay 0, sino hay uno + contar al resto
1 + contar(n-1) 1 + (1 + contar(n-1))

14/11/2006

Ing. Marco A. Adarme J.

Reglas para la recursividad


Conocer el caso trivial (fin de la recursividad)
Si no hay nadie, entonces hay cero

Definir la recursividad
sino, hay uno + contar al resto

14/11/2006

Ing. Marco A. Adarme J.

Ejemplo Factorial (x)

14/11/2006

Ing. Marco A. Adarme J.

Trabajo en clases
Definir el algoritmo recursivo para:
Saber la cantidad de dgitos de un nmero entero. Imprimir en binario el valor de un nmero.
Los nmeros binarios slo usan 0 y 1 para representar sus valores. Ejemplos:
13: 1101 (1*23+1* 22+0*21+1*20) = 8+4+1= 13

14/11/2006

Ing. Marco A. Adarme J.

Solucin
Cantidad de dgitos.
Regla 1: Es equivalente saber la cantidad de dgitos de un numero positivo que de uno negativo, por ende asumiremos que trabajamos con uno positivo
La cantidad de dgitos de 109887 es la misma que de 109887.

Si el numero es menor que 10, entonces tiene 1 dgito Sino, tiene 1 ms la cantidad de dgitos del nmero dividido 10

14/11/2006

Ing. Marco A. Adarme J.

Cdigo Java
public int contardigitos(int valor){ if (valor < 10) return 1; return (1 + contardigitos(valor/10)); }
Por ejemplo: public static void main(String args[]) { int digitos=contardigitos(321); System.out.println(digitos); // Imprime }
14/11/2006 Ing. Marco A. Adarme J.

Ejemplo int contardigitos(321)


1. Llamada Recursiva public int contardigitos(321){ if (321 < 10) return 1; return (1 + contardigitos(32)); } 2. Llamada Recursiva public int contardigitos(32){ if (32 < 10) return 1; return (1 + contardigitos(3)); }

Devuelve a donde fu llamado (3) return(1+2) Devuelve 2

return(1+1)

Devuelve 1 2. Llamada Recursiva public int contardigitos(3){ if (3 < 10) return 1; Se sale y se devuelve donde fue llamado return (1 + contardigitos(??)); }
14/11/2006 Ing. Marco A. Adarme J.

A tomar en cuenta:
Invocacin del subalgoritmo a s mismo. Cada llamada al subalgoritmo se realiza con un valor de parmetro que hace el problema de menor tamao. La llamada al subalgoritmo se realiza siempre en una sentencia de seleccin. En dicha sentencia de seleccin, al menos debe de haber un caso donde se acta de forma diferente (no recursiva).Este es llamado caso base. Ocultacin de los detalles de gestin de la memoria en las llamadas recursivas(Pila Interna)
14/11/2006 Ing. Marco A. Adarme J.

Asignacin Esttica y Dinmica de memoria


Asignacin esttica Se reserva espacio en memoria a partir de una posicin FIJA, tanto para el cdigo como para los parmetros formales y variables locales de cada subprograma. La zona reservada para variables locales y parmetros formales usualmente preceden al cdigo del subprograma

14/11/2006

Ing. Marco A. Adarme J.

Asignacin Esttica y Dinmica de memoria

14/11/2006

Ing. Marco A. Adarme J.

Asignacin Esttica y Dinmica de memoria

14/11/2006

Ing. Marco A. Adarme J.

14/11/2006

Ing. Marco A. Adarme J.

Ejemplo: Buscar un dato en un Array(int)


public static boolean esta(int x, int []v, int indice) { if(indice==v.length) return false; Caso Base if(v[indice]==x) return true; return(esta(x,v,++indice)); }
Caso General: Buscar en el resto del Array

14/11/2006

Ing. Marco A. Adarme J.

Ejemplo: Buscar un dato en un Array(int)


Si int v[]={3,6,8,10} y se busca el 8
Invocacin: esta(8, v, 0) esta(x=8,v, indice=0)

v[0]!=8 esta(8,v,1) v[1]!=8 esta(8,v,2) v[2]==8 return(true)

14/11/2006

Ing. Marco A. Adarme J.

Ejemplo: Buscar un dato en un Array(int) Algoritmo Errado


public static boolean esta(int x, int []v, int indice) { if(indice==v.length) return false; if(v[indice]==x) return true; return(esta(x,v,indice++)); }

Cul es el error?
14/11/2006 Ing. Marco A. Adarme J.

Ejemplo: Buscar un dato en un Array(int) Algoritmo Errado


La postCondicin hace que el indice siempre valga 0, generando llamadas recursivas infinitas

14/11/2006

Ing. Marco A. Adarme J.

Imprimir en binario el valor de un nmero


Los nmeros binarios slo usan 0 y 1 para representar sus valores. Ejemplos:
13: 1101
(1*23+1* 22+0*21+1*20) = 8+4+1= 13

Un posible algoritmo sera:


Si el numero es 0 o 1 su valor en binario es conocido, es si mismo Sino, es la representacin binaria de la mitad del numero, seguido de un 0 o un 1 si es el numero es par o impar respectivamente

14/11/2006

Ing. Marco A. Adarme J.

Cdigo Java
public String enbinario(int x){ if (x = 0) return 0; if (x = 1) return 1; if (n%2 = 0) // es par return (enbinario(x/2)+0); if (n%2 = 1) // es impar return (enbinario(x/2)+1); }

14/11/2006

Ing. Marco A. Adarme J.

Anda mungkin juga menyukai