Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C]Problemi con ricorsione

    Salve ragazzi!Vi scrivo perchè non riesco proprio a capire il funzionaento del metodo ricorsivo..ad esempio dato questo programma:
    codice:
    Assegnato un vettore di elementi,scrivere una funzione ricorsiva che calcoli il minimo valore tra la differenza di ogi elemento con il precedente
    Io ho provato a buttare giù qualcosa del tipo:
    codice:
    #include<iostream>
    using namespace std;
    int Differenza(double *n,int indice,int risultato);
    int main()
    {
        double n[3]={8,4,5};
        cout << Differenza(n,2,0);
        return 0;
    }
    int Differenza(double *n,int indice,int risultato)
    {
    
        if (indice == 0)
            return risultato;
    
        risultato = n[indice]-n[indice-1];
            if (risultato>Differenza(n,--indice,risultato))  //Quando qua decremento l'indice,...
               risultato = Differenza(n,--indice,risultato) ;//Quava decrementato ulteriormente?
    }
    Solo che:1)Non viene;2)Non sono molto convinto del metodo da me utilizzato.

    Premetto che il calcolare le somme,i prodotti e altri calcoli iterativamente (ad es.il fattoriale) sono capace,ma quando si tratta di fare dei confronti all'interno della funzione vado in palla
    Suggerimenti?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include<iostream>
    using namespace std;
    double Differenza(double *n,int indice);
    int main()
    {
        double n[3]={8,4,5};
        cout << Differenza(n,2);
        return 0;
    }
    double Differenza(double *n,int indice)
    {
    
        if (indice == 1)
            return n[indice]-n[indice-1];
        
        double this = (n[indice]-n[indice-1]), rec = Differenza(n, indice-1);
        
        return (rec < this) ? rec : this;      
    }
    o meglio
    codice:
    #include<iostream>
    #include <limits>
    using namespace std;
    double Differenza(double *n,int indice,double min);
    int main()
    {
        double n[3]={8,4,5};
        cout << Differenza(n,2,numeric_limits<double>::max());
        return 0;
    }
    double Differenza(double *n, int indice, double min)
    {
    
        if (indice == 0)
            return min;
        
        return Differenza(n, indice - 1, ((n[indice]-n[indice-1]) < min) ? (n[indice]-n[indice-1]) : min);
    }
    Comunque si tratta di C++ e non di C...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Innanzitutto grazie della risposta...ma mi piacerebbe avere anche dei commenti del codice da te utilizzato e dei commenti ai miei errori...grazie ancora.

    codice:
    Comunque si tratta di C++ e non di C...
    E' vero hai ragione

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include<iostream>
    using namespace std;
    double Differenza(double *n,int indice);
    int main()
    {
        double n[3]={8,4,5};
        cout << Differenza(n,2);
        return 0;
    }
    double Differenza(double *n,int indice)
    {
        //Se ci sono solo due valori la differenza minima è la differenza fra questi due
        if (indice == 1)
            return n[indice]-n[indice-1];
        //-
        
        //Trovo la differenza fra gli ultimi 2 elementi
        double this = (n[indice]-n[indice-1]);
        //-
    
        //Trovo la differenza minimima degli elementi precedenti
        double rec = Differenza(n, indice-1);
        //-
        
        //Ritorno il valore minore
        return (rec < this) ? rec : this;
        //- 
    }
    codice:
    #include<iostream>
    #include <limits>
    using namespace std;
    double Differenza(double *n,int indice,double min);
    int main()
    {
        double n[3]={8,4,5};
        //Args: l'array, l'indice >, il > valore possibile (Gli altri saranno neccessariamente <)
        cout << Differenza(n,2,numeric_limits<double>::max());
        //-
        return 0;
    }
    double Differenza(double *n, int indice, double min)
    {
        //Se l'indice è 0 non esiste un valore precedente: ritorno l'argomento min (differenza minima)
        if (indice == 0)
            return min;
        //-
        
        //Args: array, indice-1 (calcolo differenza < sui valori precedenti), differenza ultimi due elemnti se questa è < di min, altrimenti min
        return Differenza(n, indice - 1, ((n[indice]-n[indice-1]) < min) ? (n[indice]-n[indice-1]) : min);
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Ok..ma potresti dirmi cos'è quel numeric_limit?E' una sorta di costante che indica il massimo valore assumibile dal tipo specifico?E' una costante all'interno di <limits> ?
    Comunque devo assimilarmi un pò il codice e rassegnarni all'idea che funzioni...magari mi aiuterò con il debugger . .
    Un'ultima cosa ...a cosa serve la ricorsione che se gestita male può portare un overflow (credo si dica così) della memoria?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    È un template della libreria standard, sì, in questo caso serve per il valore massimo assumibile da double...

    La ricorsione serve a semplificare le definizioni, utilizzi per definire la funzione la funzione stessa, quindi ti basta definire il caso base e quello normale...
    Una volta capito il meccanismo sono assai di più facile comprensione...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    codice:
    Una volta capito il meccanismo sono assai di più facile comprensione...
    Il problema sta proprio nel capire il concetto D:
    Non è per niente facile..ad ogni modo grazie delle spiegazioni
    Ciao, alla prossima

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da Marco1995
    codice:
    Una volta capito il meccanismo sono assai di più facile comprensione...
    Il problema sta proprio nel capire il concetto D:
    Ti consiglio di leggere The Little Schemer...
    Non è per niente facile..ad ogni modo grazie delle spiegazioni
    Ciao, alla prossima
    Non c'è di che
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    The little schemer?Di cosa si tratta?Esiste anche una versione in italiano? :P

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da Marco1995
    The little schemer?
    Già...
    Di cosa si tratta?
    Dovrebbe essere un'introduzione al linguaggio Scheme, è più che altro un'introduzione alla ricorsione e alle Higher-order function che usa Scheme come veicolo.
    E' ricco di esempi ed esercizi e ti permette di capire concretamente la ricorsione e di capirne l'utilità...
    Esiste anche una versione in italiano? :P
    Non ne ho idea
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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 © 2025 vBulletin Solutions, Inc. All rights reserved.