Duda con Recursividad en C, Dev C++ 4.9.9.2

Publicado en 'Programación' por Germán, 9 Feb 2011.





  1. Germán

    Germán Miembro nuevo

    Registro:
    1 May 2010
    Mensajes:
    14
    Likes:
    1




    Saludos! Necesito ayuda con este código, no sé por qué no funciona...

    Trata de calcular el seno sin la función de la librería math.h, para tal propósito, uso la serie:

    sen(x)=x-((x^3)/3!)+((x^5)/5!)-((x^7)/7!)+((x^9)/9!)+...

    NOTA:
    La serie sólo debe contar con 17 elementos.
    X debe ingresar en radianes
    X^5 = potencia
    5!= factorial de 5​

    Sé que el problema está en la recursividad, pero no sé cuál es:

    PD: Cualquier error o sugerencia a mi programa o a mi forma de programar, estaré contento de leer:

    Código:
    /*
     * NombreProg: senos
     * Descripcion: calcula la función seno sin uso de librerías
     *
     *
     * Autor: *******
     * Fecha: 08/02/11 08:43
     *
     */
    
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    
    #define PI 3.141592
    
    int var=1;
    
    using namespace std;
    
    double seno(double ang);
    double factorial(int n);
    double potencia(double x, int n);
    bool multiplicidad(int n);
    
    int main()
    {
       double ang;
       
       scanf("%lf", &ang);
       ang=ang*3.141592/180; [COLOR="blue"]//Conversión a radianes[/COLOR]
       printf("el seno de 30 es %lf", seno(ang));[COLOR="Blue"] // Puse el angulo de 30 para probar, pero me retorna un valor incorrecto[/COLOR]
    
    
       getch();
       return(0);
    
    }
    
    double seno(double ang)
    {
       
       if(var==33){
          return 0;
       }
       
       if(var==1){ 
          var=var+2;
          return (ang+(seno(ang)));
       }
       
       if(multiplicidad(var)){
          var=var+2;
          return potencia(ang,var-2)/factorial(var-2) + seno(ang);
       }
       else{
          var=var+2;
          return -((potencia(ang,var-2))/factorial(var-2)) + seno(ang);
       }
    }
    
    double factorial(int n)
    {
       int i;
       double f=1.0;
       
       for(i=1; i<=n;i++){
          f=f*i;
       } 
       
       return f;
    }
    
    double potencia(double x, int n)
    {
       int i;
       double p=1.0;
       
       for(i=1; i<=n; i++){
          p=p*x;
       }
       
       return p;
    }
    
    bool multiplicidad(int n) //Evalúa el signo del término de la serie.
    {
       if((n-1)%4==0){
          return true;
       }
       else{
          return false;
       }
    }
    
     
    Última edición: 9 Feb 2011


  2. ViXoZuDo

    ViXoZuDo Miembro de bronce

    Registro:
    24 Jun 2008
    Mensajes:
    1,657
    Likes:
    48
    Pa ver... como te lo explico Germán (para que veas que le puse la tilde)...

    El problema empieza desde el primer

    Código:
       if(var==1){ 
       var=var+2;
       return (ang+(seno(ang)));
       }
    
    Ten en cuenta que es código innecesario y de por si bastaba que el primer trabajo de la formula trabaje como ((ang^1)/1) y al final te iba a dar el ang y así ya no tiene que procesar un condicional adicional cada vez que corre.


    Ahora, la verdad que el codigo más sencillo que podrías haber hecho era algo así.
    Código:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    using namespace std;
    
    double seno(double ang);
    double factorial(int n);
    double potencia(double x, int n);
    
    int main()
    {
       system ("color 0A");//asdasdasd zZZz matrix effect
       double ang;
       scanf("%lf", &ang);
       ang=ang*3.141592/180;
       printf("el seno de 30 es %lf", seno(ang));
       getch();
       return(0);
    }
    
    double seno(double ang)
    {
       int i,var=1;
       double X=0;
       for(i=1; i<33;i+=2){
          X=X+(potencia(ang,i)/factorial(i)*var);
          var=var*-1;
       }
       return X;
    }
    
    double factorial(int n)
    {
       int i;
       double f=1.0;
       for(i=1; i<=n;i++){
          f=f*i;
       } 
       return f;
    }
    
    double potencia(double x, int n)
    {
       int i;
       double p=1.0;
       for(i=1; i<=n; i++){
          p=p*x;
       }
       return p;
    }
    Ahora, si de verdad querías la recursividad.

    Código:
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    
    int var=1;
    
    using namespace std;
    
    double seno(double ang);
    double factorial(int n);
    double potencia(double x, int n);
    bool multiplicidad(int n);
    
    int main()
    {
       double ang;
       scanf("%lf", &ang);
       ang=ang*3.141592/180; //Conversión a radianes
       printf("el seno de 30 es %lf", seno(ang)); // Puse el angulo de 30 para probar, pero me retorna un valor incorrecto
       getch();
       return(0);
    
    }
    
    double seno(double ang)
    {
       if(var==33){
          return 0;
       }
       if(multiplicidad(var)){
          var=var+2;
          
          return potencia(ang,var-2)/factorial(var-2) + seno(ang);
       }
       else{
          var=var+2;
          
          return (-(potencia(ang,var-2))/factorial(var-2)) + seno(ang);
       }
    }
    
    double factorial(int n)
    {
       int i;
       double f=1.0;
       
       for(i=1; i<=n;i++){
          f=f*i;
       } 
       
       return f;
    }
    
    double potencia(double x, int n)
    {
       int i;
       double p=1.0;
       
       for(i=1; i<=n; i++){
          p=p*x;
       }
       
       return p;
    }
    
    bool multiplicidad(int n) //Evalúa el signo del término de la serie.
    {
       if((n-1)%4==0){
          return true;
       }
       else{
          return false;
       }
    }
    ¿Ya viste donde está tú error? :oops: te lo dejo de tarea para que no te jalen.
     
  3. Germán

    Germán Miembro nuevo

    Registro:
    1 May 2010
    Mensajes:
    14
    Likes:
    1
    Sí. Sé que cometí hartos errores. De eso no hay duda, pero ten en cuenta que lo hice CHICHA porque Salinas lo pidió en tiempo récord. YO SÉ que el método más simple no es el recursivo, pero quería darme el gusto de hacerlo.
     
  4. Partisano

    Partisano Miembro nuevo

    Registro:
    28 Nov 2008
    Mensajes:
    24
    Likes:
    1
    Chicos, creo que se están confundiendo.

    Lo que hacen sus funciones son bucles. La recursividad es cuando una función se llama a sí misma.

    Para la función potencia, el código recursivo sería:

    private double potencia(double numero, double p, int exponencial, int i)
    {
    if (i >= exponencial)
    return p;
    else
    {
    p = p * numero;
    return potencia(numero, p, exponencial, i + 1);
    }
    }

    // la variable i arranca desde cero hasta el valor de exponencial.
    // para hallar la potencia de 2^5 sería: potencia(2,1,5,0);
     
    Última edición: 17 Feb 2011
  5. ViXoZuDo

    ViXoZuDo Miembro de bronce

    Registro:
    24 Jun 2008
    Mensajes:
    1,657
    Likes:
    48
    En la función seno hay recursividad si no te haz fijado bien... y tambien ahi es donde estaba el problema.

    Y si te fijas bien, le mencione claramente que el segundo ejemplo era el que aplicaba la recursividad en la función que el quería. Un poco más de minuciosidad al revisar el código.
     
Etiquetas: