Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] problema output con cout di un valore ritornato da una funzione ricorsiva

    ho creato questo programma per approssimare le radici della funzione f(x) con il metodo di bisezione, tutto è a posto fino a quando la funzione bisezione deve ritornare c come valore.
    con
    codice:
    cout<<"c vale"<<c;
    prima del comando return c; il valore è giusto ma appena entro nella funzione main il programma stampa sempre la stringa 1.#QNAN.
    codice:
    #include <iostream>
    #include <math.h>
    using namespace std;
    float f(float x)
    {return  x;}
    
    float bisezione(float a,float b, float prec,float lastValue)
    {     float c,diff;
          c=(a+b)/2;
          diff=fabs(f(c)-lastValue);
          if(f(c)==0 || diff<prec)
                         {return c;}
          if(f(a)*f(c)<0)
                         {bisezione(a,c,prec,f(c));}
          if(f(b)*f(c)<0)
                         {bisezione(c,b,prec,f(c));}  
    }    
    
    int main()
    {
        float a,b,precisione=1e-6,tmp;
        cout<<"a"<<endl;
        cin>>a;
        cout<<"b"<<endl;
        cin>>b;
        if(f(a)*f(b)<0)
        {if(a>b)
                {tmp=b;
                 b=a;
                 a=tmp;}                        
         cout<<"f(x)=0 in x["<<a<<";"<<b<<"] per x="<<bisezione(a,b,precisione,f(a))<<endl;}
        else
        {cout<<"f(a) e f(b) non hanno segno diverso"<<endl;}
        system("PAUSE");
        return 0;
    }
    con una qualsiasi coppia di valori a e b con segno diverso c dovrebbe risultare 0, sto calcolando la soluzione di x=0, e in effetti nella funzione bisezione assume il valore giusto ma poi non lo ritorna

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    nn so se sia questo il prblema, ma il valore ritornato dalle chiamate ricorsive non lo ritorni:

    if(f(a)*f(c)<0)
    {bisezione(a,c,prec,f(c));}
    if(f(b)*f(c)<0)
    {bisezione(c,b,prec,f(c));}


    mentre dovrebbero essere

    if(f(a)*f(c)<0)
    { return bisezione(a,c,prec,f(c));}
    if(f(b)*f(c)<0)
    { return bisezione(c,b,prec,f(c));}

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    ottimo, adesso funziona, non capisco però perchè devo fare così (forse farei meglio a leggere qualcosa sulla ricorsione in C++, però)

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    perhc ela funzione deve ritornare un risultato in ogni caso

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    ok, in caso di funzioni ricorsive la prima chiamata o porta a un risultato o ritorna la funzine che glielo fa trovare...
    grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.