14/11/2006
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
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
Definir la recursividad
sino, hay uno + contar al resto
14/11/2006
14/11/2006
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
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
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.
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.
14/11/2006
14/11/2006
14/11/2006
14/11/2006
14/11/2006
14/11/2006
Cul es el error?
14/11/2006 Ing. Marco A. Adarme J.
14/11/2006
14/11/2006
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