Академический Документы
Профессиональный Документы
Культура Документы
Clase Practica
Integrantes:
Grupo: AMU-CO
26/02/19
Problemas de Recursividad
Problema 1.
La factorial de un número entero 𝑛 ≥ 0, denotado como 𝑛!, se define como ∏𝑛𝑖=1 𝑖 = 1 ∗ 2 ∗ … ∗ 𝑛
cuando 𝑛 > 0, y 0! = 1.
Diseñad un método recursivo que lo calcule e implementadlo en Java (junto con un programa que
lo utilice)
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
while(v.equals(""))
{
System.out.println(titulo);
v = sc.nextLine();
if(!v.matches("^[0-9 ]*$"))
{
v = "";
}
}
return v;
}
public static int maxcd(int a,int b)
{
if(b==0) return a;
else return maxcd(b,a%b);
}
}
CAPTURA DEL PROGRAMA
Problema 3.
Diseñad un método recursivo tal que, dado un vector de números 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.
Usando el método recursivo, implementad el método que lo usa para calcular la suma de todo el
vector, es decir:
import java.util.InputMismatchException;
import java.util.Scanner;
una en la que la subcadena sobre la que trabaja la función sea el prefijo de la cadena
original
otra en la que sea el sufijo.
En ambos casos implementad la función que llama a la función recursiva diseñada, es decir:
package invertcadena;
import java.util.Scanner;
String cadena;
}
public static String validacampo(String titulo)
String v= "";
while(v.equals(""))
System.out.println(titulo);
v = f.nextLine();
if(!v.matches("^[A-Za-z0-9 ]*$"))
v = "";
return v;
}
CAPTURA DEL PROGRAMA
Problema 5.
El ejemplo de la exponenciación mostrado en los apuntes, permite la siguiente descomposición:
2
Si b es par, 𝑎𝑏 = 𝑎2∗(𝑏 div 2) = (𝑎𝑏 div 2 )
2
Si b es impar, 𝑎𝑏 = 𝑎2∗(𝑏 div 2)+1 = 𝑎 ∗ (𝑎𝑏 div 2 )
Acabad de diseñar la solución recursiva que la emplea, implementar la solución en Java y hacer el
mismo diagrama de llamadas para el caso de 713 .
Nota: Es muy interesante que intentéis resolver un mismo problema de varias maneras y
comparéis entre sí las diferentes soluciones.
}
else if(Bandera==2)
{
Titulo="Ingrese el valor de nuevo el valor de la
variable B:\n Desea salir del programa Si.";
System.out.println(Titulo);
Valorb=Entrada.nextLine();
}
else
{
Bandera=0;
}
}while(Bandera!=0 && Valora.equalsIgnoreCase("Si")!=true &&
Valorb.equalsIgnoreCase("Si")!=true);
if(Bandera==0)
{
Titulo="La exponencial en descomposicion es
igual:"+Exponencial(Integer.parseInt(Valora),Integer.parseInt(Valorb));
System.out.println(Titulo);
}
else if(Valora.equalsIgnoreCase("Si")==true ||
Valorb.equalsIgnoreCase("Si")==true)
{
System.out.println("A salido del programa.");
System.exit(0);
}
}
public static int Exponencial(int A,int B)
{
int Valor=0;
if(B>0)
{
if(B %2==0)
{
Valor=(int) Math.pow((Math.pow(A, B/2)),2);
return Valor;
}
else
{
Valor=(int) Math.pow(A*(Math.pow(A, B/2)),2);
return Valor;
}
}
else
{
return 1;
}
}
}
CAPTURA DEL PROGRAMA
Problema 6.
Ya que estamos, diseñad un método tal que dada una cadena, retorne la cadena invertida (es
decir, el primer carácter del resultado será el último de la cadena dada, etc.). Dicho método tendrá
la forma:
import java.util.Scanner;
Para poder hacerlo recursivamente deberéis, como ya es habitual, hacer otro método que incluya
índices para indicar los trozos de subvectores sobre los que se trabaja. Indicad qué llamada se
hace al método recursivo para resolver el problema inicial.
if (ComparacionArray(vec1,vec2,n-1,true)) System.out.print("Los
arreglos son iguales");
else System.out.print("Los arreglos no son iguales");
}
static boolean ComparacionArray(int [] vec1,int [] vec2, int pos,boolean
boleano) {
if (pos==0) return boleano;
else {
if (vec1[pos] == vec2[pos]) ComparacionArray(vec1,vec2,pos-
1,boleano);
else return false;
}
return boleano;
}
}
CAPTURA DEL PROGRAMA
Problema 8.
Diseñad un método tal que calcule el máximo de un vector no vacío de números enteros. De
forma similar al problema 4, implementad el método que llama al que habéis definido
recursivamente para que se calcule el máximo de todo el vector.
import java.util.InputMismatchException;
import java.util.Scanner;
for(i=0; i<n;i++) {
myList[i] = GetInt("Introduzca número "+i+":");
}
2*x=x+x
2 * x también puede implementarse (y en realidad el código que genera el compilador es
lo que hace) desplazando un bit la representación binaria de x. En el tema de Archivos
veremos cómo usar los desplazamientos de bits en Java.
int x = 0 ,y ,resultado;
x= GetInt("por favor ingresar el primer numero");
y= GetInt("ingresa el segundo numero");
resultado =(2*x)*(y/2);
una que vaya comprobando elemento a elemento si dicha propiedad se cumple (para esta
versión, el método recursivo usará, además 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 métodos que hacen la llamada inicial al que habéis diseñado
recursivamente dando valores iniciales a los índices.
Pista: podéis pensar qué relación tiene este problema con la búsqueda dicotómica y, si la
encontráis, obtendréis la solución.
int n,dato,retorno;
n= GetInt("por favor ingresar el tamano del vector:");
retorno=BusquedaRecursiva(vec, n-1,dato);
if(retorno==dato)
System.out.println("El dato se encuentra en el vector y en el
indice concide");
else if (retorno>-1)
System.out.println("El dato se encuentra en el vector pero el
indice no concide");
else
System.out.println("El dato no se encuentra:");
}
}
CAPTURA DEL PROGRAMA
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 más complicado que en el caso anterior (obviamente cuando se
intenta hacer la versión que, a cada paso divide la longitud del intervalo donde buscar por la
mitad).
Pista: la idea de la solución consiste en darse cuenta de que los valores crecen como mínimo tanto
como los índices. Esto es cierto porque el vector no contiene elementos repetidos.
}
System.out.println("Ingrese el numero a buscar");
int Numero_Buscar=Entrada.nextInt();
if(Funcion_media(Numero_Buscar)==-1)
{
System.out.println("El numero a buscar no existe");
}
else
{
System.out.println("El valor esta en la posicion:
"+(Funcion_media(Numero_Buscar)));
}
}
}
public static String Validadar(String Valora,String Titulo1, String
Titulo2)
{
int Bandera=0;
String Titulo=Titulo1;
do {
Bandera=0;
}
}while(Bandera!=0 && Valora.equalsIgnoreCase("Si")!=true);
return Valora;
}
public static int Funcion_media(int Numero)
{
int longitud= (Arreglo.length)/2;
if(Numero<=Arreglo[longitud])
{
for(int i=longitud; i>=0; i--)
{
if(Arreglo[i]==Numero)
{
return i;
}
}
}
else if(Numero>=Arreglo[longitud])
{
for(int i=longitud-1; i<Arreglo.length; i++)
{
if(Arreglo[i]==Numero)
{
return i;
}
}
}
return -1;
}
}
CAPTURA DEL PROGRAMA
Problema 12.
La sucesión de Fibonacci viene definida por la siguiente recurrencia:
𝑓𝑛+2 = 𝑓𝑛 + 𝑓𝑛+1
con valores iniciales 𝑓0 = 0 y 𝑓1 = 1.
int n, i;
for(i=0;i<n;i++){
System.out.print(fibonaci(i)+" ");
String v = "";
while(v.equals(""))
System.out.println(titulo);
v = b.nextLine();
if(!v.matches("^[0-9 ]*$"))
v = "";
}
return v;