Planteamiento del Ejercicio acompañado del algoritmo de resolución en Java
Planteamiento:
Ejercicio 1. Programar un algoritmo recursivo que calcule el factorial de un número.
Solución:
int factorial(int n){
if(n==0) return 1; //AXIOMA
else return n*factorial(n-1); //FORMULA RECURSIVA
}
Planteamiento:
Ejercicio 2. Programar un algoritmo recursivo que calcule un número de la serie fibonacci.
Solución:
int fibonaci(int n){
if(n==1 || n==2) return 1;
else return fibonaci(n-1)+fibonaci(n-2);
}
Planteamiento:
Ejercicio 3. Programar un algoritmo recursivo que permita hacer la división por restas sucesivas.
Solución:
int division (int a, int b)
{
if(b > a) return 0;
else
return division(a-b, b) + 1;
}
Planteamiento:
Ejercicio 4. Programar un algoritmo recursivo que permita invertir un número.
Ejemplo: Entrada:
123 Salida:
321Solución:
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Planteamiento:
Ejercicio 5. Programar un algoritmo recursivo que permita sumar los dígitos de un número.
Ejemplo: Entrada:
123 Resultado:
6Solución:
int sumar_dig (int n)
{
if (n == 0) //caso base
return n;
else
return sumar_dig (n / 10) + (n % 10);
}
Planteamiento:
Ejercicio 6. Programar un algoritmo recursivo que permita hacer una multiplicación, utilizando el método Ruso. Para mas informacion: aqui (http://es.wikipedia.org/wiki/Multiplicaci%C3%B3n_por_duplicaci%C3%B3n).
Solución:
int mult_rusa(int A, int B)
{
if(A==1){
return (B);
}
if(A%2!=0){
return(B+mult_rusa( A/2 , B*2));
}
else{
return(mult_rusa( A/2 , B*2));
}
}
Planteamiento:
Ejercicio 7. Programar un algoritmo recursivo que permita sumar los elementos de un vector.
Solución:
int suma_vec(int v [], int n)
{
if (n == 0)
return v [n];
else
return suma_vec(v, n - 1) + v [n];
}
Planteamiento:
Ejercicio 8. Programar un algoritmo recursivo que permita multiplicar los elementos de un vector.
Solución:
int multiplicar (int vec [], int tam)
{
if (tam == 0)
return (vec [0]);
return (vec [tam] * multiplicar (vec, tam - 1));
}
Planteamiento:
Ejercicio 9. Programar un algoritmo recursivo que calcule el Maximo comun divisor de dos números.
Solución:
int sacar_mcd(int a, int b) {
if(b==0)
return a;
else
return sacar_mcd(b, a % b);
}
Planteamiento:
Ejercicio 10. Programar un algoritmo recursivo que determine si un número es positivo.
Solución:
public boolean positivo(int n){
if(n>0) return true;
else return negativo(n);
}
public boolean negativo(int n){
if(n<0) return false;
else return positivo(n);
}
Planteamiento:
Ejercicio 11. Programar un algoritmo recursivo que determine si un número es impar utilizando recursividad cruzada.
Solución:
public boolean par(int n){
if(n==0) return true;
else return impar(n-1);
}
public boolean impar(int n){
if(n==0) return false;
else return par(n-1);
}
Planteamiento:
Ejercicio 12. Programar un algoritmo recursivo que permita sumar los elementos de una matriz.
Solución:
int suma (int fila, int col, int orden, int mat [] [])
{
if (fila == 0 && col == 0)
return mat [0] [0];
else
if (col < 0)
return suma (fila - 1, orden, orden, mat);
else
return mat [fila] [col] + suma (fila, col - 1, orden, mat);
}
Planteamiento:
Ejercicio 13. Programar un algoritmo recursivo que permita resolver el cuadro latino.
Ejemplo de cuadro latino:
0 0 0 0 1
0 0 0 1 2
0 0 1 2 3
0 1 2 3 4
1 2 3 4 5
Solución:
latino (int fila, int col, int cont, int orden, int mat [] [])
{
if (fila == 0 && col == 0)
mat [0] [0] = 1;
else
if (fila == col)
latino (fila - 1, orden - 1, orden, orden, mat);
else
{
mat [fila] [col] = cont;
latino (fila, col - 1, orden + 1, orden, mat);
}
}
Planteamiento:
Ejercicio 14. Programar un algoritmo recursivo que permita resolver la siguiente matriz:
1 1 1 1 1
1 2 2 2 2
1 2 4 4 4
1 2 4 8 8
1 2 4 8 16Solución: Solucionado por:
AmeRiK@nO
public class MatrizRecursividad {
private static int a=0, aux=1, b=0; //Declaramos los datos necesarios
private static int[][] matriz = new int[6][6]; //La matriz debe ser cuadrada
public static void main(String[] args) {
llenarMatriz(matriz, a, b); //Iniciamos el llamado recursivo
imprimir(); //imprimimos la matriz
}
public static void llenarMatriz(int matriz[][], int i, int j){
if(j > matriz.length -1){ //Si llegó a la ultima coluna, reseteamos los datos para la siguiente
i++;
j=0;
aux++;
}
if(i <matriz.length){ // compara que no hallamos llegado al final
if(i==(aux-1) && j >= (aux-1)){ //comprueba que estemos en el lugar adecuado, es decir ira imprimiento escaladamente
if(i==0)// si es la primera fila ingresamos aux=1
matriz[i][j] = matriz[i][j]=aux;
else
matriz[i][j] = matriz[i][i-1]*2;//ingresamos el valor correspondiente al ultimo de la "escala" *2
llenarMatriz(matriz, i , j+1);
}
else{ //si no, asignamos los valores anteriores de la escala
if(j==0)// comprobamos si es el primer digito a ingresar
matriz[i][j] = j+1;
else
matriz[i][j] = matriz[i-1][j];// asignamos el mismo numero de la fila anterior (i-1)
llenarMatriz(matriz, i, j+1);
}
}
}
public static void imprimir(){ //este metodo nos imprime la matriz por consola
for(int i=0; i< matriz.length; i++){
for(int j=0; j< matriz.length; j++){
System.out.print(matriz[i][j] + " ");
}
System.out.print("\n");
}
}
}
Planteamiento:
Ejercicio 15. Programar un algoritmo recursivo que ejecute la matriz del cubo mágico.
Solución:
void magico(int mat [] [], int fil, int colmedio, int c, int n)
{
if (c == n * n)
{
mat [n-1] [colmedio] = c;
}
else
{
if (fil < 0 && colmedio == n)
{
magico(mat, fil + 2, n - 1, c, n);
}
else
{
if (fil < 0)
{
magico(mat, n - 1, colmedio, c, n);
}
else
{
if (colmedio == n)
{
magico(mat, fil, 0, c, n);
}
else
{
if (mat [fil] [colmedio] == 0)
{
mat [fil] [colmedio] = c;
magico(mat, fil - 1, colmedio + 1, c + 1, n);
}
else
{
magico(mat, fil + 2, colmedio - 1, c, n);
}
}
}
}
}
}
Planteamiento:
Ejercicio 16. Programar un algoritmo recursivo que muestre el numero menor de un vector.
Solución:
int menorvec (int x [], int n, int menor) {
if (n == 0)
if (menor > x [n]) return x [0];
else return menor;
else
if (menor > x [n]) return menorvec (x, n - 1, x [n]);
else return menorvec (x, n - 1, menor); }
Planteamiento:
Ejercicio 17. Programar un algoritmo recursivo que muestre el numero mayor de un vector.
Solución:
int mayor (int numeros [], int posicion) {
int aux;
if (posicion == 0) return numeros [posicion];
else {
aux = mayor (numeros, posicion - 1);
if (numeros [posicion] > aux) return numeros [posicion];
else return mayor (numeros, posicion - 1);
}
}
CitarRecursividad
1.1. Introducción.
El concepto de recursividad va ligado al de repetición. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una función, son llamados desde ella misma una y otra vez, en contraposición a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc.
1.2. Definición.
Algo es recursivo si se define en términos de sí mismo (cuando para definirse hace mención a sí mismo). Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado.
1.3. Elementos de la Recursión
1.3. 1. Axioma
Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a sí mismo. Evita la continuación indefinida de las partes recursivas.
1.3.2. Formula recursiva
Relaciona el resultado del algoritmo con resultados de casos más simples. Se hacen nuevas llamadas a la función, pero están más próximas al caso base.
Por ejemplo: El factorial de un número
factorial(0) -> 1
factorial(1) -> 1*factorial(0)
factorial(2) -> 2*factorial(1)
factorial(3) -> 3*factorial (2)
... -> ...
factorial(N) -> 3*factorial (N-1)
En la resolución de algoritmos recursivos es imprescindible encontrar estos dos elementos.
1.4. Tipos de recursión
1.4.1. Recursividad simple
Aquella en cuya definición sólo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos.
1.4.2. Recursividad múltiple
Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función, resultando más difícil de hacer de forma iterativa. Un ejemplo típico es la función de fibonacci
1.4.3. Recursividad anidada
En algunos de los argumentos de la llamada recursiva hay una nueva llamada a sí misma. La función de Ackermann se define por recursividad como sigue:
1.4.4. Recursividad cruzada o indirecta
Son algoritmos donde una función provoca una llamada a sí misma de forma indirecta, a través de otras funciones.
OHK
Alguien se anima a resolver el ejercicio 14 ?
OHK
lo intentare hacer pero necesito tiempo, por que ando ocupado.
amerikano
Oye una recomendación, el de fibonnaci no es conveniente hacerlo por recursividad, por lo siguiente, y es que las llamadas recursivas se dividen en dos lo cual conlleva a repetir un mismo proceso mas de dos veces y eso le resta velocidad y eficiencia :xD era solo eso jeje.
salu2
Cita de: ohk en 11 Octubre 2008, 03:19 AM
Planteamiento:
Ejercicio 14. Programar un algoritmo recursivo que permita resolver la siguiente matriz:
1 1 1 1 1
1 2 2 2 2
1 2 4 4 4
1 2 4 8 8
1 2 4 8 16
Solución:
No solucionado...
Bueno yo ya solucione el numero 14 jeje estaba facilito solo que no tenia tiempo de hacerlo, aca va:
public class MatrizRecursividad {
private static int a=0, aux=1, b=0; //Declaramos los datos necesarios
private static int[][] matriz = new int[6][6]; //La matriz debe ser cuadrada
public static void main(String[] args) {
llenarMatriz(matriz, a, b); //Iniciamos el llamado recursivo
imprimir(); //imprimimos la matriz
}
public static void llenarMatriz(int matriz[][], int i, int j){
if(j > matriz.length -1){ //Si llegó a la ultima coluna, reseteamos los datos para la siguiente
i++;
j=0;
aux++;
}
if(i <matriz.length){ // compara que no hallamos llegado al final
if(i==(aux-1) && j >= (aux-1)){ //comprueba que estemos en el lugar adecuado, es decir ira imprimiento escaladamente
if(i==0)// si es la primera fila ingresamos aux=1
matriz[i][j] = matriz[i][j]=aux;
else
matriz[i][j] = matriz[i][i-1]*2;//ingresamos el valor correspondiente al ultimo de la "escala" *2
llenarMatriz(matriz, i , j+1);
}
else{ //si no, asignamos los valores anteriores de la escala
if(j==0)// comprobamos si es el primer digito a ingresar
matriz[i][j] = j+1;
else
matriz[i][j] = matriz[i-1][j];// asignamos el mismo numero de la fila anterior (i-1)
llenarMatriz(matriz, i, j+1);
}
}
}
public static void imprimir(){ //este metodo nos imprime la matriz por consola
for(int i=0; i< matriz.length; i++){
for(int j=0; j< matriz.length; j++){
System.out.print(matriz[i][j] + " ");
}
System.out.print("\n");
}
}
}
Bueno cualquier duda comenten que pa eso estoy :xD.
salu2
amerikano
@AmeRiK@nO, tu ejercicio corre perfectamente, y el codigo no es dificil de interpretar, porque haces codigo limpio.
Ahora mismo lo agrego tu ejercicio a el espacio que falta.
Gracias por el aporte
Un saludo
jeje debes corregir esto:
if(i==0)// si es la primera fila ingresamos aux=1
matriz[i][j] = matriz[i][j]=aux;
Vez, lo puse dos veces sin querer, ahora pon solo uno:
if(i==0)// si es la primera fila ingresamos aux=1
matriz[i][j] =aux;
Se me coló uno sin darme cuenta ;D, pero así y todo funcionó :), solo era eso.
salu2
Cita de: AmeRiK@nO en 5 Diciembre 2008, 01:49 AM
jeje debes corregir esto:
if(i==0)// si es la primera fila ingresamos aux=1
matriz[i][j] = matriz[i][j]=aux;
Vez, lo puse dos veces sin querer, ahora pon solo uno:
if(i==0)// si es la primera fila ingresamos aux=1
matriz[i][j] =aux;
Se me coló uno sin darme cuenta ;D, pero así y todo funcionó :), solo era eso.
salu2
:xD
Da igual, ademas quien lo use se dara cuenta :rolleyes:
De todos modos no tiene error, ni sintactico ni semantico. :P
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.
Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10 = 2 + 3*10 = 32
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Pero lo hice así y funciona:
public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}
Aqui agrego unos mios:
- Determinar si una palabra es Palíndroma:
public boolean palindroma(String palabra, int i, int j){
if(i != (palabra.length()/2)){
if(palabra.charAt(i) == palabra.charAt(j))
return palindroma(palabra, ++i, --j);
else
return false;
}
return true;
}
- Sumar el borde de una matriz de enteros:
public int sumaBorde(int i, int j){
if(i >matriz.length-1)
return 0;
else{
if(j > matriz.length-1 ){
j=0;
i++;
return sumaBorde(i,j);
}else{
if((i==0) || (i==matriz.length -1) || (j==0) ||(j==matriz.length -1))
return matriz[i][j] + sumaBorde(i,j+1);
}
}
return sumaBorde(i,j+1);
}
Salu2
Buenas tardes:
Me gustaría conocer el código de estos ejercicios implementándolo en ambiente gráfico. Gracias.
Es lo mismo.
Son algoritmos, así que puedes implementarlos como función, y luego pasarle los parámetros correspondientes desde tus objetos.
Un saludo
Cita de: pixzeto en 11 Junio 2009, 02:03 AM
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.
Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10 = 2 + 3*10 = 32
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Pero lo hice así y funciona:
public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}
Tu algoritmo no es recursivo, recordemos que la recursividad es una alternativa a la iteracion (los bucles for, while no deben usarse al implementar recursividad) pero vale el intento ;)
Cita de: saintmauricioxd en 20 Abril 2010, 18:44 PM
Cita de: pixzeto en 11 Junio 2009, 02:03 AM
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.
Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10 = 2 + 3*10 = 32
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Pero lo hice así y funciona:
public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}
Tu algoritmo no es recursivo, recordemos que la recursividad es una alternativa a la iteracion (los bucles for, while no deben usarse al implementar recursividad) pero vale el intento ;)
Me gustaria una aclaracion sobre recursividad ,ya que sin ella discrepo contigo , porque considero que ese algoritmo si es recursivo por aplicarse el tambien cierto concepto de :" La recursividad simplemente significa aplicar una función como parte de la definición de esa misma función. " . (yo lo entiendo como , si una funcion se llama dentro de su misma funcion = recursividad )
Entonces quisiera saber : si una funcion tiene n bucles PERO SE HACE RECURSIVIDAD (osea el concepto que yo manejo) , el algoritmo es recursivo o deja de serlo por tener n bucles ?.
Cita de: saintmauricioxd en 20 Abril 2010, 18:44 PM
Cita de: pixzeto en 11 Junio 2009, 02:03 AM
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.
Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10 = 2 + 3*10 = 32
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Pero lo hice así y funciona:
public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}
Tu algoritmo no es recursivo, recordemos que la recursividad es una alternativa a la iteracion (los bucles for, while no deben usarse al implementar recursividad) pero vale el intento ;)
Mal, muy mal, los ciclos no tienen nada que ver con la recursividad, repasa tus apuntes.
Y como prueba, observa algunos algoritmos recursivos, como la ordenación quicksort.
http://es.wikipedia.org/wiki/Quicksort
estoy realizando un ejercicio donde ya realise un programa en el cual ingreso un numero positivo y este me genera la tabla de multiplicar hasta el 10
el asunto es que no tengo ni la mas minima idea de como hacer que este se vulva recursivo ya que en todas las veces que se comento en ninguna el programa esta echo como mi profesora me lo enseño.
Hola amigos! estoy llevando un curso de informatica pero yo soy un principiante en la materia. Quisiera saber como ustedes harían un programa con las siguientes normas:
Implemente, tanto de forma recursiva como de forma iterativa, un método que nos devuelva el máximo común divisor de dos números enteros utilizando el algoritmo de Euclides.
ALGORITMO DE EUCLIDES
Dados dos números enteros positivos m y n, tal que m > n, para encontrar su máximo común divisor (es decir, el mayor entero positivo que divide a ambos):
a) Dividir m por n para obtener el resto r (0 <= r < n)
b) Si r = 0, el MCD es n.
c) Si no, el máximo común divisor es MCD(n,r).
Espero que me puedan ayudar, Gracias!!
xDDDDDDD muestranos lo que tienes y te ayudaremops :D:D
PD : tarea??
Aqui no se hacen tareas... dejen de pedir eso.
Cita de: pixzeto en 11 Junio 2009, 02:03 AM
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.
Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10 = 2 + 3*10 = 32
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Pero lo hice así y funciona:
public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}
Aqui un aporte mio:
public String Invertir(int num){
if (num < 10)
return String.valueOf(num);
else
return String.valueOf(num%10) + Invertir(num/10);
}
Cita de: pavelinhos en 26 Noviembre 2010, 21:35 PM
Aqui un aporte mio:
public String Invertir(int num){
if (num < 10)
return String.valueOf(num);
else
return String.valueOf(num%10) + Invertir(num/10);
}
Aunque ojo que ahí se esta retornado un String y no un int como es pedido, claramente esto simplifica extremadamente el código por que la suma de cadenas de caracteres simplemente se concatenan a diferencia de la suma de números donde se deben elevar los dígitos a la potencia respectiva para lograr invertir el número. De todas maneras, me gusto mucho tu implementación :)
Agrego otra implementación:
public static int invertir(int n)
{
if(n/10==0)
return n;
else
{
String s=String.valueOf(n);
int aux=n;
int contador=s.length();
while(aux%10!=0)
{
contador--;
break;
}
return (int) ((n%10)*Math.pow(10, contador)+invertir(n/10));
}
}
Saludos
Cita de: criptofan en 4 Diciembre 2010, 20:11 PM
Aunque ojo que ahí se esta retornado un String y no un int como es pedido, claramente esto simplifica extremadamente el código por que la suma de cadenas de caracteres simplemente se concatenan a diferencia de la suma de números donde se deben elevar los dígitos a la potencia respectiva para lograr invertir el número. De todas maneras, me gusto mucho tu implementación :)
Saludos
Otra manera seria, convertir el String en un int luego de invertir:
public int Invertir(int num){
String r;
if (num < 10)
r= String.valueOf(num);
else
r= String.valueOf(num%10) + Invertir(num/10);
return Integer.parseInt(r);
}
Esta funcion utilizando la misma logica de recursividad de la idea original funciona
FUNCTION invertir(n INTEGER) RETURN INTEGER deterministic AS
vnumDig integer;
vnuParEntera pls_integer;
BEGIN
vnuParEntera := trunc(n, 0);
vnumDig := fnugetNumOfDig(vnuParEntera);--esta es una funcion que me obtiene el numero de digito
if vnumDig = 1 then
return vnuParEntera;
end if;
return(vnuParEntera mod 10) * Power(10, vnumDig - 1) + invertir(vnuParEntera / 10);
END invertir;
FUNCTION invertir(n INTEGER) RETURN INTEGER deterministic AS
vnumDig integer;
vnuParEntera pls_integer;
BEGIN
vnuParEntera := trunc(n, 0);
vnumDig := fnugetNumOfDig(vnuParEntera);--esta es una funcion que me obtiene el numero de digito
if vnumDig = 1 then
return vnuParEntera;
end if;
return(vnuParEntera mod 10) * Power(10, vnumDig - 1) + invertir(vnuParEntera / 10);
END invertir;
Como haria yo para implementar una función de recursividad para copiar arreglos hasta llenar la memoria.
Es que ocupo crear un programa que cree un arreglo que se llene con mil numeros enteros y despues que haga copias de ese arreglo hasta caer en fallos de memoria
aki les mando el metodo invertir en forma recursiva
public int invertir(int n){
int res=0;
if(n<10){
res=n;
}
else{
res=(n % 10)*(int)Math.pow(10, cantDigitos(n)-1) + invertir(n / 10);
}
return res;
}
estuve revisando los metodos realizados en esta pagina y
en la mayoria de los metodos vi un error que no es tan error
este es mi consejo y tomenlo del lado positivo vale
utilizan mucho el return y lo aconsejable es que solo se invoke el return
solo una 1 ves
bye y viva la ufc
hola a todos bueno
aki les dejo un programita que les sirva de mucho lo interesante de este metodo es
que hace 3 veces la llamada recursiva
1
21
321
4321
54321
654321
asi sucecivamente
public int triangulo(int n){
int res=0;
if(n==1){
res=1;
}
else{
res=(int)Math.pow(10,cantDigitos(triangulo(n-1) ))*n+triangulo(n-1);
}
return res;
}
Me dejaron de tarea el ejercicio 13, que coincidencia :P
Aqui lo dejo por si les sirve de algo ver otra manera de resolver el cuadro latino, yo use menos parametros.
PD: Adjunto la api para que lo prueben.
public void cLatino(int[][]mt, int fila, int col)
{
if ( (fila+col+1)==mt.length )
mt[fila][col] = 1;
else if ( (fila+col)>=mt.length )
mt[fila][col] = (fila+col+2)-mt.length;
if ( col<mt.length-1 ) col++;
else if ( fila<mt.length-1 ) { fila++; col=0; }
else return;
cLatino(mt,fila,col);
}
public void Latino(int[][]Mt)
{ cLatino(Mt,0,0); }
Api:
http://upwap.ru/1455317 (http://upwap.ru/1455317)
Hola haber si alguien me puede ayudar nesesito este algoritmo (multiplicacion de matrices) en forma recursiva...
void ingreso(int m[][30],int f,int c){
for(int i=0;i<f;i++){
for(int j=0;j<c;j++){
cout<<"Valor ["<<(i+1)<<"]["<<(j+1)<<"]= ";
cin>>m[j];
}
}
}
void mostrar(int m[][30],int f, int c){
for(int i=0;i<f;i++){
for(int j=0;j<c;j++){
cout<<"Valor ["<<(i+1)<<"]["<<(j+1)<<"]= ";
cout<<m[j]<<endl;
}
}
}
void multiplica(int m1[][30],int m2[][30],int p[][30],int f1,int c1,int f2,int c2){
for(int i=0;i<f1;i++){
for(int j=0;j<c2;j++){
for(int k=0;k<c1;k++){
p[j]=p[j]+(m1[k])*(m2[k][j]);
}
}
}
cout<<"\n\n\t\tEL PRODUCTO DE VECTORES ES\n\n";
mostrar(p,f1,c2);
}
void inicializaValoresEnCero(int p[][30],int f,int c){
for(int i=0;i<f;i++){
for(int j=0;j<c;j++){
p[j]=0;
}
}
}
int main(){
int M1[30][30],M2[30][30],P[30][30],f1,c1,f2,c2;
cout<<"\n\tPrimera Matriz"<<endl;
do{
cout<<"Ingrese el numero de filas ";
cin>>f1;
}while(f1<1||f1>30);
do{
cout<<"Ingrese el numero de columnas ";
cin>>c1;
}while(c1<1||c1>30);
ingreso(M1,f1,c1);
cout<<"\n\tSegunda Matriz"<<endl;
do{
cout<<"Ingrese el numero de filas ";
cin>>f2;
}while(f2<1||f2>30);
do{
cout<<"Ingrese el numero de columnas ";
cin>>c2;
}while(c2<1||c2>30);
ingreso(M2,f2,c2);
if(c1==f2){
cout<<"Se puede multiplicar"<<endl;
inicializaValoresEnCero(P,f1,c2);
multiplica(M1,M2,P,f1,c1,f2,c2);
}
else
cout<<"NO Se puede multiplicar"<<endl;
system("pause");
return 0;
}
Me gustaría saber como hacer un método recursivo que reciba un número entero binario y devuelva el número entero
decimal equivalente. Y también como hacer un método recursivo que reciba un número entero decimal y devuelva una cadena con el
número equivalente hexadecimal.
No tengo idea ni de como comenzar.
LBN
En c++ resolvi el de invertir de ésta manera:
#include <math.h>
int inv(int n){
if(n <= 9) return n;
else return inv(n/10) + inv(n%10)*pow(10, n%10-1);
}
hola a todos:
Estoy haciendo un curso de java, en el cual tengo que utilizar una función recursiva, o pongo en antecedentes:
Estamos creando un multicine, para comprar entradas y demas. El problema viene a la hora de reservar asientos, los cuales puedes ser consecutivos (si tenemos suerte) o no ( que es mi caso).
La historia es que si un cliente va a comprar 5 entradas al cine, y no tienen 5 entradas correlativas en la fila que quiera dicho cliente, los he de re-ubicar en otra zona del cine y en el peor de los casos en el que no haya por ningun lado 5 asientos consecutivos, pues por ejemplo ponerlos 3 en una fila y 2 en la siguiente justo delante , y sino de la manera en la que puedan estar mas cerca unos de otros.
No voy a decir que me resolvais el codigo, evidentemente, pero la verdad es que no tengo ni p**a idea de como hacerlo. Necesito ayuda de cualquier tipo.
Muchas gracias
Hola, necesito sacar de forma recursiva los divisores de un numero, tengo la iterativa, pero ni en broma consiga la recursiva. graciaas
public static int recursividad(int numero){
if(numero>2)
{
return 0;
}else
{
return recursividad(numero%numero-1);
}
}
/*
Aqui esta una opcion de como se pueden generar con recursividad el ejercicio de invertir un numero.. Se regresa un String, y para solucionar el problema de imprimir ceros innecesarios al inicio o final del String, ocupo un contador y una condición extra..!
**/
public static void main(String[] args) {
System.out.println( invertir ( 1230456 ) );
}// cierro metodo main
public static String invertir( int a, int b) {
int c = ++b;
if( a % 10 == 0 && c - 1 == 0){
return ( "" + invertir( ( a / 10 ) , c - 1 ));
}else{
if ( a == 0 )
return "";
else
return ( ( a % 10 ) + invertir( ( a / 10 ) , c ) );
}
}//cierro metodo invertir
por favor ME PUEDEN AYUDAR EN ESTA sumatoria EJERCICIO es la siguiente:
X^1/1!+X^2/2!+X^N/N!
String pal=JOptionPane.showInputDialog("Introduce la palabra");
JOptionPane.showMessageDialog(null, palabra(pal,pal.length(),"Su invertido es: "));
}
static String palabra(String c, int inv, String tama)
{
inv=inv-1;
if(inv>=0)
{
tama=tama+c.charAt(inv);
return palabra(c,inv,tama);
}
else return tama;
}
sin while/for/etc.
public int invertir(int n){
String aux=Integer.toString(n);
if (n<10)
return n;
else return (int) ((n%10)*Math.pow(10, aux.length()-1)+invertir(n/10));
}
¿Quien me puede ayudar sumatoria e^x /x! recursividad java?
favor me podrian ayudar ya que llevo varios dias sin resolver, maso menos tengo este codigo
es la sumatoria de e a la x sobre x factorial
donde e = 2.718186 y x ingresa el usuario
package ejrecursividad;
import java.util.Scanner;
public class SumaFactorialLeperiano {
static double FACTOR(int valor1) {
if (valor1 == 0) {
return 2.718186;
} else {
int valor2;
valor2=valor1;
return (Math.pow(2.718186,valor1)/(valor2))+(Math.pow(2.718186,FACTOR(valor1 - 1))/(valor2 * FACTOR(valor2 - 1)));
}
}
public static void main(String[] args) {
double resultado;
int valor1;
System.out.println("ingrese nro1");
Scanner mrno = new Scanner(System.in);
valor1 = mrno.nextInt();
resultado = FACTOR(valor1);
System.out.println("LA SUMATORIA DEL: " + valor1 + " ES: " + resultado);
Después de bastantes vueltas conseguí el código jajajaja No se como pones esas tablitas tan bonitas que poneis vosotros, pero os lo pego aqui a ver si alguno puede hacerme el favor de ponerlo bien :)
/**
* subprograma que recoje un número por teclado y lo devuelve invertido en el orden
* @param num (numero que recojemos por teclado y queremos invertir)
* @return resultado (numero invertido)
*/
public static String invertir (int num){
String resultado = "";
if (num < 10) //caso base
resultado = resultado + num;
else { //caso general
resultado = invertir (num / 10);
resultado = ((num % 10)+" , ") + resultado;
}
return resultado;
}
Cita de: Amerikano|Cls en 27 Noviembre 2008, 22:30 PM
Oye una recomendación, el de fibonnaci no es conveniente hacerlo por recursividad, por lo siguiente, y es que las llamadas recursivas se dividen en dos lo cual conlleva a repetir un mismo proceso mas de dos veces y eso le resta velocidad y eficiencia :xD era solo eso jeje.
salu2
Pero si que es conveniente si lo haces con memoria, esto lo que hará es ahorrar un gran número de operaciones ya que las que ya ha calculado las guarda en un mapa y cuando se necesita se utilizan los resultados guardados:
public static int fibonacciMemoria(int n, Map<Integer, Integer> m){
int res = 0;
if(n<=1){
return n;
}else{
int fibon1 = 0;
int fibon2 = 0;
if(m.containsKey(n-1)){
fibon1 = m.get(n-1);
}else{
fibon1 = fibonacciMemoria(n-1,m);
}
if(m.containsKey(n-2)){
fibon2 = m.get(n-2);
}else{
fibon2 = fibonacciMemoria(n-2,m);
}
res = fibon1+fibon2;
m.put(n, res);
}
return res;
}
Y ya si quieres calcular con números mas grandes puedes hacerlo con BigInteger de igual forma:
public static BigInteger fibonacciGrande(BigInteger n, Map<BigInteger, BigInteger> m){
BigInteger res = new BigInteger("0");
if(n.compareTo(new BigInteger("1"))<=0){
return n;
}else{
BigInteger fibon1 = new BigInteger("0");
BigInteger fibon2 = new BigInteger("0");
if(m.containsKey(n.subtract(new BigInteger("1")))){
fibon1 = m.get(n.subtract(new BigInteger("1")));
}else{
fibon1 = fibonacciGrande(n.subtract(new BigInteger("1")),m);
}
if(m.containsKey(n.subtract(new BigInteger("2")))){
fibon2 = m.get(n.subtract(new BigInteger("2")));
}else{
fibon2 = fibonacciGrande(n.subtract(new BigInteger("2")),m);
}
res = fibon1.add(fibon2);
m.put(n, res);
}
return res;
}
Un saludo.
Chincheta
Cita de: kakimanu en 27 Septiembre 2014, 18:30 PM
Pero si que es conveniente si lo haces con memoria, esto lo que hará es ahorrar un gran número de operaciones ya que las que ya ha calculado las guarda en un mapa y cuando se necesita se utilizan los resultados guardados:
public static int fibonacciMemoria(int n, Map<Integer, Integer> m){
int res = 0;
if(n<=1){
return n;
}else{
int fibon1 = 0;
int fibon2 = 0;
if(m.containsKey(n-1)){
fibon1 = m.get(n-1);
}else{
fibon1 = fibonacciMemoria(n-1,m);
}
if(m.containsKey(n-2)){
fibon2 = m.get(n-2);
}else{
fibon2 = fibonacciMemoria(n-2,m);
}
res = fibon1+fibon2;
m.put(n, res);
}
return res;
}
Y ya si quieres calcular con números mas grandes puedes hacerlo con BigInteger de igual forma:
public static BigInteger fibonacciGrande(BigInteger n, Map<BigInteger, BigInteger> m){
BigInteger res = new BigInteger("0");
if(n.compareTo(new BigInteger("1"))<=0){
return n;
}else{
BigInteger fibon1 = new BigInteger("0");
BigInteger fibon2 = new BigInteger("0");
if(m.containsKey(n.subtract(new BigInteger("1")))){
fibon1 = m.get(n.subtract(new BigInteger("1")));
}else{
fibon1 = fibonacciGrande(n.subtract(new BigInteger("1")),m);
}
if(m.containsKey(n.subtract(new BigInteger("2")))){
fibon2 = m.get(n.subtract(new BigInteger("2")));
}else{
fibon2 = fibonacciGrande(n.subtract(new BigInteger("2")),m);
}
res = fibon1.add(fibon2);
m.put(n, res);
}
return res;
}
Un saludo.
Exactamente como dice
kakimanu, se puede hacer el fibonacci de forma dinámica, aqui les dejo un ejemplo recursivo de la forma dinamica manteniendo los valores ya calculados en un array de
long, a mi entender un poquito más sencilla.
static void Main(string[] args)
{
long n = long.Parse(Console.ReadLine()); //Se solicita el termino de fibonacci a calcular
fibonacci = new long[n+1];
Console.WriteLine(Fibonacci(n));
}
static long Fibonacci(long n)
{
if (fibonacci[n] != 0) //Se verifica si no se calculo ya
return fibonacci[n]; //Se devuelve si ya se calculo
if (n == 1 || n==2)
return 1;
fibonacci[n - 2] = Fibonacci(n - 2); //se guarda en el array
fibonacci[n - 1] = Fibonacci(n - 1); //se guarda en el array
return fibonacci[n - 2] + fibonacci[n - 1];
}
n problema de recursividad en C , de la expresion de abajo hay que sacar una definicion de recursividad mostrando el caso base y la funcion recursiva.
El problema es este:
El número de euler es ampliamente utilizado
en el cálculo matemático pero que no puede
ser expresado con un número de decimales
finito. Tiene un valor aproximado de 2,718.
Para poder obtener aproximaciones de
dicho número existen diferentes reglas que
pueden ser aplicadas. Siguiendo un desarrollo
decimal como el mostrado en la figura, puede
obtenerse el número e.
Para poder realizar un algoritmo que realice dicho cálculo aproximado se
requiere crear una función con el siguiente prototipo:
float f_euler(int n)
Esta función devolverá la aproximación del número e aplicando n desarrollos.
Como puede suponer, mientras más grande sea n (más desarrollos serán aplicados),
mejor será la aproximación. Considere los siguientes ejemplos:
f_euler(0)=2
f_euler(1)=2+ 2/2=3
f_euler(2)=2+ 2/(2+ 3/3)= 2.6666...
f_euler(5)=2+ 2/(2+ 3/(3+ 4/(4+ 5/(5+6/6)))))= 2.7184...
Buenas, tengo que hacer este problema de forma recursiva. Sólo se me ocurre implementarlo, pero de forma normal, es decir sin recursión. Si me pudiérais ayudar os lo agradecería.
La factorización de números enteros consiste en descomponer un número compuesto (no primo) en divisores no triviales que cuando se multiplican dan el número original. Para nuestro propósito académico queremos implementar una función recursiva que devuelva el número de divisores distintos de un número dado. Por ejemplo, el número 20 tiene 6 divisores: 1, 2, 4, 5, 10 y 20.
Hola, estoy empezando con java estoy en primer año, tengo un problema de recursion que aún no pude solucionar y se me acaba el tiempo, si ustedes pudieran indicarme el camino o resolverlo me ayudarian mucho.
El ejercicio es el siguiente:
Escribir un método recursivo int vocales(String cd) para calcular el número de vocales de una cadena.
Muchas gracias..
Cita de: pixzeto en 11 Junio 2009, 02:03 AM
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.
Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10 = 2 + 3*10 = 32
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
Pero lo hice así y funciona:
public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}
Hola Aqui un aporte :),
utilize String length para identificar el tipo de unidad (../centena/decena) en cada caso.
int invertir(int n){
if (n < 10) //caso base
return n;
return invertir(n / 10) + (n % 10) * (int) Math.Pow(10, ((n + "").Length-1));
}
Y para fibonacci :
int fibonaci(int [] array, int n) {
if (array[n-1] > 0) {
return array[n-1];
}
if (n == 1 || n == 2)
{
return 1;
}
else {
var a = fibonaci(array ,n - 1);
var b = fibonaci(array ,n - 2);
var sum = a + b;
array[n - 1] = sum;
return sum;
}
}
10
512[email][img]http://[youtube=640,360][youtube=640,360][s][s][sup][/sup][/s][/s][/youtube][/youtube][/img][/email] |
[/sub][/sub][/tt][/font]
[/glow][/s][/i]ww
int invertir (int n)
{
if (n < 10) //caso base
return n;
else
return (n % 10) + invertir (n / 10) * 10;
}
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}