0% encontró este documento útil (0 votos)
265 vistas4 páginas

2 Problemas de Recursividad

El documento presenta 8 problemas de recursividad para ser resueltos mediante métodos recursivos en Java. Los problemas incluyen calcular factoriales, máximo común divisor, suma de elementos de un vector, imprimir una cadena al revés, exponenciación, invertir cadenas, comparar vectores y más. Se pide diseñar métodos recursivos para cada problema y aplicarlos en programas de ejemplo.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
265 vistas4 páginas

2 Problemas de Recursividad

El documento presenta 8 problemas de recursividad para ser resueltos mediante métodos recursivos en Java. Los problemas incluyen calcular factoriales, máximo común divisor, suma de elementos de un vector, imprimir una cadena al revés, exponenciación, invertir cadenas, comparar vectores y más. Se pide diseñar métodos recursivos para cada problema y aplicarlos en programas de ejemplo.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Problemas

de Recursividad
Problema 1.
El factorial de un nmero entero ! 0, denotado como !!, se define como ! ! !! ! = 1 2 ! cuando ! > 0, y 0! = 1. Por ejemplo 6! = 1 2 3 4 5 6 = 720 Disead una mtodo recursiva que lo calcule e implementadlo en Java (junto con un programa que lo utilice)

Problema 2. .
Para calcular el mximo comn divisor de dos nmeros enteros puedo aplicar el algoritmo de Euclides, que consiste en ir restando el ms pequeo del ms grande hasta que queden dos nmeros iguales, que sern el mximo comn divisor de los dos nmeros. Por ejemplo, si comenzamos con el par de nmeros 412 y 184, tendramos: 412 228 44 44 44 44 44 36 28 20 12 8 4 184 184 184 140 96 52 8 8 8 8 8 4 4 Es decir, m.c.d.(412, 184) = 4

Problema 3.

Disear un mtodo recursivo tal que dado un vector de nmeros enteros retorne la suma de sus elementos. Para poder hacer recursividad, usaremos un ndice que indique el trozo de vector a sumar en cada llamada. Es decir, el mtodo a disear tendr la forma:
1 public int sum(int[] elems, int pos) { 2 ? 3 }

Disead este mtodo as como el que lo utiliza para calcular la suma de todo el vector. Tened en cuenta cmo hacemos para referirnos a un intervalo dentro de un vector. Qu pasa si el vector est vaco (es decir, cuando [Link] vale cero)? Usando el mtodo recursivo, implementad el mtodo que lo usa para calcular la suma de todo el vector, es decir:
4 public int sum(int[] elems) { 5 return sum(elems, ?); 6 }

Nota: Podis considerar dos descomposiciones del vector, una en la que la zona que vais sumando crece de derecha a izquierda y otra en la que lo hace en sentido contrario.

Problema 4.
Disead un mtodo recursivo que escriba al revs la cadena que se le pasa como parmetro, ms un ndice que se usar para recorrer la cadena. Dicho mtodo ser de la forma:
1 public void printReversed(String text, int index) { 2 ? 3 }

Haced dos versiones del mismo, una en la que el ndice vaya incrementndose a cada llamada y otra en la ste que vaya decrementndose. En los dos casos implementad la funcin que llama a la funcin recursiva diseada, es decir:
4 public void printReversed(String text) { 5 printReversed(text, ?); 6 }

Nota: No vale invertir la cadena y luego escribirla.

Problema 5.
El ejemplo de la exponenciacin mostrado en los apuntes, permite la siguiente descomposicin: ! Si b es par, !! = !!(! div 2) = !! div 2 Si b es impar, !! = !!(! div 2)+1 = ! !! div 2 Acabad de disear la solucin recursiva que la emplea, implementar la solucin en Java y hacer el mismo diagrama de llamadas para el caso de 7!" . Nota: Es muy interesante que intentis resolver un mismo problema de varias maneras y comparis entre s las diferentes soluciones.
!

Problema 6.
Ya que estamos, disead un mtodo tal que dada una cadena, retorne la cadena invertida (es decir, el primer carcter del resultado ser el ltimo de la cadena dada, etc.). Dicho mtodo tendr la forma:
1 public String invert(String text) { 2 ? 3 }

Para hacerlo, debis disear otro tal que dado un vector de caracteres, lo invierta. Como los parmetros que son vectores se pasan por referencia, el mtodo invert sobre vectores puede ser de la forma:
1 public void invert(char[] textChars) { 2 ? 3 }

Para encontrar recursividad deberis hacer otro mtodo que, adems del char[], use uno o ms ndices sobre el vector.

Problema 7.
Disead un mtodo tal que, dados dos vectores de enteros, retorne un booleano indicando si son iguales, es decir, si tienen los mismos valores en las mismas posiciones. Para poder hacerlo recursivamente deberis, como ya es habitual, hacer otro mtodo que incluya ndices para indicar los trozos de subvectores sobre los que se trabaja. Indicad qu llamada se hace al mtodo recursivo para resolver el problema inicial.

Problema 8.
Disead un mtodo tal que calcule el mximo de un vector no vaco de nmeros enteros. De forma similar al problema 4, implementad el mtodo que llama al que habis definido recursivamente para que se calcule el mximo de todo el vector.

Problema 9.
El algoritmo chino de multiplicacin. Disear un mtodo que multiplique dos nmeros enteros usando las siguientes equivalencias: ! 2 ! (! !"# 2), !" ! !" !"# !! = 2! = 2 ! ! !"# 2 + ! , !" ! !" !"#$% 2

Problema 10.

Dado un vector de nmeros enteros ordenado decrecientemente, disead un mtodo tal que compruebe si el valor de alguno de los elementos del vector coincide con su ndice. Podis hacer dos versiones: una que vaya comprobando elemento a elemento si dicha propiedad se cumple (para esta versin, el mtodo recursivo usar, adems del vector, un ndice). otra que, usando dos ndices, sea capaz de descartar a cada llamada la mitad del vector.

En ambos casos implementad los mtodos que hacen la llamada inicial al que habis diseado recursivamente dando valores iniciales a los ndices. Pista: podis pensar qu relacin tiene este problema con la bsqueda dicotmica y, si la encontris, obtendris la solucin.

Problema 11.

Un problema parecido al anterior se puede plantear cuando el vector de enteros est ordenado crecientemente y no contiene valores repetidos. El razonamiento en este caso es ms complicado que en el caso anterior (obviamente cuando se intenta hacer la versin que, a cada paso divide la longitud del intervalo donde buscar por la mitad). Pista: la idea de la solucin consiste en darse cuenta de que los valores crecen como mnimo tanto como los ndices. Esto es cierto porque el vector no contiene elementos repetidos.

Problema 12.

La sucesin de Fibonacci viene definida por la siguiente recurrencia: !!!! = !! + !!!! con valores iniciales !! = 0 y !! = 1. Disead e implementad un mtodo recursivo para calcular el ensimo trmino de la sucesin y mostrad el rbol de llamadas que se produce al calcular !! con vuestra solucin.

También podría gustarte