0% encontró este documento útil (0 votos)
329 vistas9 páginas

Guia de Recursividad Java Parte2 U

Este documento presenta 7 ejemplos de funciones recursivas en Java con sus respectivas soluciones. Los ejemplos incluyen funciones para invertir un número, sumar elementos pares de un arreglo, multiplicar elementos correspondientes de dos arreglos, encontrar el menor y mayor elemento de un arreglo, calcular el máximo común divisor de dos números, buscar un elemento en un arreglo, e indicar si una palabra o texto es un palíndromo. Cada ejemplo contiene el código Java completo de la función recursiva correspondiente.

Cargado por

Campos Oscar
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
329 vistas9 páginas

Guia de Recursividad Java Parte2 U

Este documento presenta 7 ejemplos de funciones recursivas en Java con sus respectivas soluciones. Los ejemplos incluyen funciones para invertir un número, sumar elementos pares de un arreglo, multiplicar elementos correspondientes de dos arreglos, encontrar el menor y mayor elemento de un arreglo, calcular el máximo común divisor de dos números, buscar un elemento en un arreglo, e indicar si una palabra o texto es un palíndromo. Cada ejemplo contiene el código Java completo de la función recursiva correspondiente.

Cargado por

Campos Oscar
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 9

Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág.

Introducción.

Ingresamos a ésta quía con el entendido que ya estudió la primera parte, de ésta
manera entenderá cada ejercicio que se plantea.

Ejemplo 1.- Mediante una función recursiva invertir un número entero (sin
utilizar conversión a cadenas). Ej: n1=1239 salida 9321

Solución: la fórmula (int)Math.log10(m)+1, permite obtener el total de dígitos que tiene un


número. Siguiendo con el ejemplo m=1239, la primera pasada, en éste caso el dígito menos
significativo, el 9 en el nuevo número debe ocupar la posición de la unidad de mil, dado que el
número n tiene 4 dígitos, entonces al mutliplicar 9x10^3 = 9*100= 9000. Para la siguiente pasada
se envía m=123, ya que es dividido entre 10, en éste caso se saca el digito menos significativo,
ahora el 3 (no explico cómo sacar el dígito por razones obvias, lo hicimos n-veces), para
3*10^2=3*100=300 que es sumado 300+9000=9300. Para la siguiente pasada m=12 y así sucesivamente
hasta tener el número invertido.

public class p1 {

public static void main(String[] args) {


int n1=1234;
System.out.println( (int)(invertir(n)));
}
public static double invertir(int m)
{
int d;
double n;
if(m>0)
{ //formula para saber cuántos dígitos tiene un número-1
n=(int)Math.log10(m);
d=m%10;
return(d*Math.pow(10,n)+invertir(m/10));
}
else
n=0;
return(n);
}
}

Ejemplo 2.- Escribir una función recursiva que imprima la suma del contenido de
las posiciones pares de un arreglo de números enteros
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 2

Solución.- En éste caso los datos del vector son {1,2,3,12,5,2,7,11}, debido a
que lo importante de ésta pregunta es solo la función. Es otra forma no estándar
de definir un vector. Como el orden de los sumandos no altera el resultado, en
la función recursiva inicia sumando los datos de las posiciones pares de derecha
a izquierda del vector. Otra consideración, es que el arreglo inicia en la
posición 0, entonces si el arreglo tiene 4 elementos las posiciones son 0,1,2,3,
entonces si la dimensión es par, considerando que que la primera posición es
cero, las posiciones pares, a la vista del usuario, son posiciones impares a la
vista del programador.

public class p2 {

public static void main(String[] args) {


int a[]={1,2,3,12,5,2,7,11};
int n=8;
if(n%2==0)n--;
System.out.println(" sumatoria elem de lugares pares "+suma(a,n));
}

public static int suma(int b[],int w)


{
int s;
if(w>0)
{ System.out.println(b[w]);
s=b[w]+suma(b,w-2);
}
else
return(0);
return(s);
}
}
Ejemplo 3.- 35. Mediante funciones recursivas generar dos vectores A y B con
números aleatorios, luego multiplicar los elementos correspondientes de los dos
vectores y almacenar en un tercer vector C. Mostrar en pantalla los tres
vectores. Los vectores son de datos enteros y sabemos que Math.random() genera
datos de tipo double, los mismos que en éste caso son cambiados a tipo de dato
int.

Solución.-Este programa no tiene menú de opciones, realiza directamente lo


pedido.
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 3

import java.util.Scanner;
public class r3 {

public static void main(String[] args) {


int []A=new int [10];
int []B=new int [10];
int []C=new int [10];
Scanner sn=new Scanner(System.in);
System.out.println("total de elementos de un vector?");
int n=sn.nextInt();
genera_vector(A,n); //vector con datos randómicos
genera_vector(B,n);
suma_vector(A,B,C,n);
System.out.println("\nVector A:");
listado_vector(A,n,0);
System.out.println("\nVector B:");
listado_vector(B,n,0);
System.out.println("\nVector C:");
suma_vector(A,B,C,n);
listado_vector(C,n,0);
sn.close();
}
public static int[] suma_vector(int x[],int y[], int z[],int k)//recursivo
{
if(k>0)
{
z[k-1] = x[k-1] + y[k-1];
suma_vector(x,y,z,--k);
}
return(x);
}
public static void listado_vector(int y[],int k,int i)//recursivo
{
if(i<k)
{
System.out.print(y[i]+"\t");
listado_vector(y,k,++i);
}
}
public static int[] genera_vector(int x[],int k)//recursivo
{
if(k>0)
{
x[k-1]=(int)(Math.random()*10);
genera_vector(x,--k);
}
return(x);
}
}

Ejemplo 4.- Escribir una funciones recursivas para determinar la posiciones del
menor y mayor elemento contenido en el vector.
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 4

Solución: Es un programa que no tiene menú de opciones, el vector se genera con


valores aleatorios.

import java.util.Scanner;

public class p4 {

public static void main(String[] args) {


int []A=new int [10];
Scanner sn=new Scanner(System.in);
System.out.println("total de elementos de un vector?");
int n=sn.nextInt();
genera_vector(A,n); //vector con datos randómicos
System.out.println("\nVector A:");
listado_vector(A,n,0);
//funcion que da el ultimo mayor en caso de ser elemento repetido
int p=mayor(A,n,0); //vector,tamaño,posición del supuesto primer mayor
System.out.println("\nA Posicion y elemento mayor "+(p+1)+" es "+A[p]);
p=menor(A,n,0);
System.out.println("\nA Posicion y elemento menor "+(p+1)+" es "+A[p]);
sn.close();
}
public static int menor(int y[],int t,int m)//recursivo
{
if(t>1)
{t--;
if(y[m]> y[t])
{
m=t;
}
m=menor(y,t,m);
}
return(m);
}
public static int mayor(int y[],int t,int m)//recursivo
{
if(t>1)
{t--;
if(y[m]< y[t])
{
m=t;
}
m=mayor(y,t,m);
}
return(m);
}
public static void listado_vector(int y[],int k,int i)//recursivo
{
if(i<k)
{
System.out.print(y[i]+"\t");
listado_vector(y,k,++i);
}
}
public static int[] genera_vector(int x[],int k)//recursivo
{
if(k>0)
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 5

{
x[k-1]=(int)(Math.random()*10); //datos randómicos
genera_vector(x,--k);
}
return(x);
}
}

Ejemplo 5.- Para encontrar el máximo común divisor de a,b, sonde a>b, se procede
de la siguiente manera:

Realice funciones recursivas para encontrar MCD(a,b) cuando a>b ó MCD(b,a) cuando
b>a.

Solución:

import java.util.Scanner;

public class p5 {

public static void main(String[] args) {

Scanner sn=new Scanner(System.in);


System.out.println("Valor de A?");
int a=sn.nextInt();
System.out.println("Valor de B?");
int b=sn.nextInt();
if(a>b)
System.out.println("El mcd es "+MCD(a,b));
if(b>a)
System.out.println("El mcd es "+MCD(b,a));
sn.close();
}

public static int MCD(int x,int y)


{ int k=y;
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 6

int r=x%y;
if(r!=0)
return(MCD(y,r));
return(k);
}
}

Ejemplo 6.- Dado un arreglo de valores constantes con valores únicos, escriba
una función recursiva que halle la posición de un valor buscado.

Solución.-La función buscar retorna la posición del elemento si lo encuentra, si


no lo encuentra, retorna el valor inicial dado de -1. Al momento de imprimir se
agrega +1 a la ubicación encontrada, considerando que la posición inicial del
arreglo es 0.

import java.util.Scanner;
public class p6 {

public static void main(String[] args) {


int a[]={1,2,3,12,5,2,7,11};
int n=8;
Scanner sn=new Scanner(System.in);
System.out.println("Elemento a buscar?");
int b=sn.nextInt();
int c=buscar(a,n,b,-1);
if(c!=-1)
System.out.println("Encontrado en la posición "+(c+1));
else
System.out.println("no encontrado");

sn.close();
}
public static int buscar(int v[],int d,int bus,int i)
{ d--;
if(d>=0)
{
if(v[d]==bus){
i=d;
}
return(buscar(v,d,bus,i));
}
return(i);
}
}

Ejemplo 7.- Un palíndromo, también llamado palindromo, palíndroma o palindroma,


es una palabra, o frase que se lee igual en un sentido que en otro. Si se trata
de números en lugar de letras, se llama capicúa. Habitualmente, las frases
palindrómicas se resienten en su significado cuanto más largas son. Realice un
programa recursivo que indique si una palabra o texto es palídroma o no.
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 7

import java.io.*;
import java.util.Scanner;

public class p7 {
public static void main(String[] args) {

Scanner sn=new Scanner(System.in);


System.out.println("palabra?");
String palabra=sn.nextLine();
int n=palabra.length(); //total de letras
System.out.println("Total de letras"+n);
if(palindroma(palabra,n,0,true))
System.out.println("Es palíndroma ");
else
System.out.println("no es palídroma ");
sn.close();
}
public static boolean palindroma(String k, int t, int i, boolean r)
{
t--;
if(t!=i && t>=i)
{
if(k.charAt(i)!=k.charAt(t)){ //sacamos una letra de la posicion, (como vector)
r=false;
}
return(palindroma(k,t,++i,r));

}
return(r);
}
}
Pregunta 8.- Dada una matriz de caracteres de tamaño NxN, verificar si una
palabra existe en la matriz. Si existe indicar la ruta para construir la
palabra en la matriz. Todos los movimientos son permitidos: arriba, abajo,
izquierda, derecha, diagonales.

Ejemplo:

Palabra “horizon”

Salida:
La palabra existe.
La ruta es:
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 8

0 0 0 0 0
0 1 0 5 0
0 0 2 4 6
0 0 0 3 7
0 0 0 0 0
Solución:

import java.util.Scanner;

public class p8{


public static void main(String[] args) {
String a[][]={{"a","b","c","d","e"},
{"f","g","h","i","j"},
{"a","e","i","o","u"},
{"l","m","n","o","p"},
{"q","r","s","t","u"}};
int [][]b={{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0}};

Scanner sn=new Scanner(System.in);


System.out.println("palabra?");
String palabra=sn.nextLine();
int r=palabra.length();
if(buscar_palabra(a,b,palabra,r,0,true)){
listado_matriz(b);
}
else{
System.out.println("no encontrada");
}
sn.close();
}
public static boolean buscar_letra(String te1[][],int nu1[][],String letra,int f,int c,int q, boolean en1)
{

if(f<5 && en1==false)


{
if(c<5 && en1==false)
{

if(letra.compareTo(te1[f][c])==0 && nu1[f][c]==0)


{
nu1[f][c]=q+1;
en1=true;
}
return(buscar_letra(te1,nu1,letra,f,++c,q,en1));
}
return(buscar_letra(te1,nu1,letra,++f,0,q,en1));
}

return(en1);
}
public static boolean buscar_palabra(String te[][],int nu[][],String p,int tam,int i, boolean en)
{ String le;
Guía de Programas recursivos en Java --- Segunda Parte Doc. M.Sc. Irma Prado Pág. 9

if(i<tam && en==true)


{
le=p.substring(i,1+i);
if(!buscar_letra(te,nu,le,0,0,i,false))
{
en=false;
}
return(buscar_palabra(te,nu,p,tam,++i,en) );
}
return(en);
}
public static void listado_matriz(int y[][])//no recursivo
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{System.out.print(y[i][j]+" \t ");}
System.out.println();
}
}

También podría gustarte