Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Sergio Perez en 22 de Abril 2021, 22:49
-
Buen día a todos, estaba trabajando con el siguiente código:
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 :-\
-
Ya logre modificarlo de la siguiente manera:
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:
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)
-
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:
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
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);
}
}
-
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
-
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:
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:
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
-
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!!! :)
-
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
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);
}
}