Autor Tema: Series recursivas con pares e impares  (Leído 427 veces)

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
Series recursivas con pares e impares
« en: 22 de Abril 2021, 22:49 »
Buen día a todos estoaba trabajando con el siguiente código:

Código: [Seleccionar]
package ejemploseriefibonacci;

import java.util.Scanner;

public class EjemploSerieFibonacci {

public static void main(String[] args) {
// Leer teclado
Scanner teclado = new Scanner(System.in);
System.out.println("Ingresa el tamaño de la serie: ");
int numero = teclado.nextInt();

//muestra resultado o serie
for(int i = 0; i < numero; i++) {
System.out.print(Fibonacci(i)+" ");
}
System.out.println("");
}

//Metodo que calcula secuencia hasta llegar a n números
public static int Fibonacci(int n) {
if(n > 1) {
//funcion recursiva
return Fibonacci(n - 1) + Fibonacci(n - 2);
}else if(n==1){
//caso base
return 1;
}else if(n==0) {
//caso base
return 0;
}else {
//Error
System.out.println("Debes ingresar un tamaño de valor = ó > a 1");
return -1;
}

}

}


Alguna sugerencia de que le puedo quitar/agregar para que haga lo siguiente:

La suma de los primeros n números pares.
Por ejemplo: si n=5 obtener 2+4+6+8+10
La suma de los primero n números impares.
Por ejemplo: si n=5 obtener 1+3+5+7+9    :-\

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
Re: Series recursivas con pares e impares
« Respuesta #1 en: 23 de Abril 2021, 00:57 »
Ya logre modificarlo de la siguiente manera:

Código: [Seleccionar]
package ejemploseriefibonacci;

import java.util.Scanner;

public class EjemploSerieFibonacci {

public static void main(String[] args) {
// Leer teclado
Scanner teclado = new Scanner(System.in);
System.out.println("Ingresa el tamaño de la serie: ");
int numero = teclado.nextInt();

//muestra resultado o serie
for(int i = 0; i < numero; i++) {
System.out.print(Fibonacci(i+2)+" ");
}
System.out.print("\n");

for(int x = 0; x < numero; x++) {
System.out.print(Fibonacci(x+1)+" ");
}
System.out.println("");
}

//Metodo que calcula secuencia hasta llegar a n números
public static int Fibonacci(int n) {
if(n > 1) {
//funcion recursiva
return Fibonacci(n - 1) + Fibonacci(n - 1);
}else if(n==1){
//caso base
return 1;
}else if(n==0) {
//caso base
return 0;
}else {
//Error
System.out.println("Debes ingresar un tamaño de valor = ó > a 1");
return -1;
}

}

}
El problema es que ahora me saca esto en pantalla:
Citar
Ingresa el tamaño de la serie: 5
2 4 8 16 32 (aquí debería ser: 2 4 6 8 10)
1 2 4 8 16 (aquí debería ser: 1 3 5 7 9)

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Series recursivas con pares e impares
« Respuesta #2 en: 23 de Abril 2021, 01:40 »
Pero no te están pidiendo ninguna serie Fibonacci, esta serie es un poco más compleja que una "simple" suma de pares/impares consecutivos.

Y bueno, he aquí otra cuestión:
 ¿Te están pidiendo que saques una serie de pares en pantalla?
¿O te están pidiendo que calcules la suma de esa serie de pares (sin tener que mostrar ninguna serie en pantalla)?

Si se trata de obtener la suma, que es lo que yo entiendo al leer esto:

Citar
La suma de los primeros n números pares.
Por ejemplo: si n=5 obtener 2+4+6+8+10
La suma de los primero n números impares.
Por ejemplo: si n=5 obtener 1+3+5+7+9

Puede hacerse con estos dos métodos recursivos que pongo en el código de abajo.

Lo que hacen es comenzar con el par (o impar) MAYOR de la serie.
En cada llamada recursiva, retorna ese par sumándole el siguiente par inferior.
Si nos piden la suma de los 5 primeros pares, comienza por 10 (2 * 5).
Y va sumando 10 + 8 + 6 + 4 + 2 + 0

Código: [Seleccionar]
public class ParesRecursivos {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);

System.out.println("Suma de primeros pares.");
System.out.print("Indique tamaño serie: ");
int n = teclado.nextInt();

System.out.println("Suma = " + nPares(n * 2));

System.out.println("\n\nSuma de primeros impares.");
System.out.print("Indique tamaño serie: ");
n = teclado.nextInt();

System.out.println("Suma = " + nImpares((n * 2) - 1));

teclado.close();
}

private static int nPares(int n) {
if (n <= 0)
return 0;
else
return n + nPares(n - 2);
}

private static int nImpares(int n) {
if (n <= 0)
return 0;
else if (n == 1)
return 1;
else
return n + nImpares(n - 2);
}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
Re: Series recursivas con pares e impares
« Respuesta #3 en: 23 de Abril 2021, 01:46 »
De hecho si esta mejor el planteamiento que propone estimado moderador  ;D

Ya solo tengo que ver la forma de que en lugar de imprimir sólo el 30 en pares por ejemplo, imprima: 2+4+6+8+10=30

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Series recursivas con pares e impares
« Respuesta #4 en: 23 de Abril 2021, 14:38 »
Que imprimir la serie lo haga la propia función recursiva,...mmmmh..., me temo que no es posible, o al menos no sabría cómo hacerlo.
Quizás añadiendo más variables y complicando el código más..., pero aún así no estaría seguro de cómo hacerlo.


Si la serie la imprime el programa, no la función recursiva, entonces sí puede hacerse usando bucles.
El bucle se repetirá n veces  y en cada iteración muestra un par/impar seguido del símbolo +
Solo habría que comprobar cuándo llega el bucle a la última iteración, en cuyo caso además de imprimir el último par/impar de la serie, llamaría a la función recursiva para que calculase la suma:

Código: [Seleccionar]
public class ParesRecursivos {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);

System.out.println("Suma de primeros pares.");
System.out.print("Indique tamaño serie: ");
int n = teclado.nextInt();

for (int i = 1; i <= n; i++) {
if (i != n) //Imprimiendo serie...
System.out.print((i * 2) + " + ");
else //Serie termina aquí, mostramos también la SUMA
System.out.println((i * 2) + " = " + nPares(n * 2));
}


System.out.println("\n\nSuma de primeros impares.");
System.out.print("Indique tamaño serie: ");
n = teclado.nextInt();

for (int i = 1; i <= n; i++) {
if (i != n) //Imprimiendo serie...
System.out.print(((i * 2) - 1) + " + ");
else //Serie termina aquí, mostramos también la SUMA
System.out.println(((i * 2) - 1) + " = " + nImpares((n * 2) - 1));
}


teclado.close();
}

private static int nPares(int n) {
if (n <= 0)
return 0;
else
return n + nPares(n - 2);
}

private static int nImpares(int n) {
if (n <= 0)
return 0;
else if (n == 1)
return 1;
else
return n + nImpares(n - 2);
}

}

En pantalla tendríamos esto:

Citar
Suma de primeros pares.
Indique tamaño serie: 5
2 + 4 + 6 + 8 + 10 = 30


Suma de primeros impares.
Indique tamaño serie: 8
1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 = 64
« Última modificación: 23 de Abril 2021, 14:41 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
Re: Series recursivas con pares e impares
« Respuesta #5 en: 23 de Abril 2021, 17:07 »
Ohhhhh grande maestro Kabuto!!!!

La verdad de lo que yo estaba intentando me daba otros valores pero ya con tú código veo en donde estaba mi error... De verdad gracias!!!  :)

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Series recursivas con pares e impares
« Respuesta #6 en: 24 de Abril 2021, 19:35 »
Me acabo de dar cuenta  ::)  de que no se necesitan dos funciones distintas.
Con una sola función es suficiente, si recibe un par trabajará con pares, y si recibe un impar lo hará con los mismos.... pues el proceso es el mismo.
Tanto a uno como otros, para pasar al siguiente de la lista, basta con restarle - 2

Código: [Seleccionar]
public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);

System.out.println("Suma de primeros pares.");
System.out.print("Indique tamaño serie: ");
int n = teclado.nextInt();

for (int i = 1; i <= n; i++) {
if ( i < n)
System.out.print((i * 2) + " + ");
else
System.out.println((i * 2) + " = " + sumaSerie(n*2));
}

System.out.println("Suma de primeros impares.");
System.out.print("Indique tamaño serie: ");
n = teclado.nextInt();

for (int i = 1; i <= n; i++) {
if ( i < n)
System.out.print((i * 2 - 1) + " + ");
else
System.out.println((i * 2 - 1) + " = " + sumaSerie((n*2) - 1));
}

teclado.close();

}


//Funcion recursiva
private static int sumaSerie(int n) {

if (n <= 0)
return 0;
else
return n + sumaSerie(n-2);
}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".