Codice esempio sbagliato a lezione ma il docente afferma di no

di il
15 risposte

Codice esempio sbagliato a lezione ma il docente afferma di no

Salve, come da titolo , il docente stava facendo vedere un esempio di calcolo fattoriale e ha riportato questo codice :
#include <iostream>
using namespace std;

int fattoriale(int n)
{
    if (n<=2) {
        return 1;
    } else {
        return n * fattoriale(n-1);
    }
    
}

int main() {
    
    
    cout<<fattoriale(5)<<endl;
    return 0;
}
Io ho fatto notare che è sbagliato in quanto , se ad esempio volessi calcolare 5! , mi riporta 60 anzichè 120 poichè entrando nell'f quando si arriva a 2 , me lo calcola come 1 e quindi non moltiplica 60x2 ..... sbaglio io che mi sto rincretinendo o sbaglia lui? tra l'altro il fattoriale di 2 è 2 bah

15 Risposte

  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    RafSa ha scritto:


    Salve, come da titolo , il docente stava facendo vedere un esempio di calcolo fattoriale e ha riportato questo codice :
    #include <iostream>
    using namespace std;
    
    int fattoriale(int n)
    {
        if (n<=2) {
            return 1;
        } else {
            return n * fattoriale(n-1);
        }
        
    }
    
    int main() {
        
        
        cout<<fattoriale(5)<<endl;
        return 0;
    }
    Io ho fatto notare che è sbagliato in quanto , se ad esempio volessi calcolare 5! , mi riporta 60 anzichè 120 poichè entrando nell'f quando si arriva a 2 , me lo calcola come 1 e quindi non moltiplica 60x2 ..... sbaglio io che mi sto rincretinendo o sbaglia lui? tra l'altro il fattoriale di 2 è 2 bah
    Con tutto il rispetto, per il professore, hai ragione tu.

    Io la funzione la fare così:
    #include <iostream>
    using namespace std;
    
    int fattoriale(int n)
    {
        if (n<=1) {
            return 1;
        } else {
            return n * fattoriale(n-1);
        }
        
    }
    
    int main() {
        
        
        cout<<fattoriale(5)<<endl;
        return 0;
    }
    Secondo me è abbastanza chiaro... Anche perché 0! per definizione è 1....
    A mio modesto parere la tua obiezione è corretta.

    Un saluto!
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    Oppure usare minore anziché minore o uguale.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    Alexv ha scritto:


    Oppure usare minore anziché minore o uguale.
    Sì, credo sia una questione di gusti. A me pare più leggibile, da un punto di vista formale, con il <=1, ma è corretto anche come dici tu.

    Un saluto.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    Lauree trovate dentro gli ovetti Kinder
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    Ciao
    il codice non è sbagliato perchè quello che calcola lui è il fattoriale di n-1 e poi lo moltiplica per n.
    nel tuo caso n=5 avrai fattoriale = 4! * 5 = 24 * 5 = 120
    l'unico appunto che potresti fare al tuo docente e che il 2!=2 e non a 1 probabilmente si sara distratto.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    smalldragon ha scritto:


    Ciao
    il codice non è sbagliato perchè quello che calcola lui è il fattoriale di n-1 e poi lo moltiplica per n.
    nel tuo caso n=5 avrai fattoriale = 4! * 5 = 24 * 5 = 120
    l'unico appunto che potresti fare al tuo docente e che il 2!=2 e non a 1 probabilmente si sara distratto.
    Onestamente non mi è chiaro quello che dici... Fattoriale di n-1? la chiamata fattoriale(n-1) è l'elemento precedente da moltiplicare, sottrazione che poi fa giungere alla codinzione di uscita di un approccio ricorsivo...

    Puoi spiegarti meglio, a me non torna la tua valutazione.

    Un saluto.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    Appunto hai capito cosa ti devo spiegare?
    il punto che il professore voleva farvi capire l'approccio ricorsivo tramite la chiamata alla funzione.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    @RafSa: il codice proposto e' QUASI giusto!

    C'e' un "refuso": al prof gli e' scappato un "<= 2" invece di un "< 2".

    A parte questa "svista", il codice e' assolutamente corretto.

    Si tratta dell'implementazione della funzione "fattoriale" fatta in "modo ricorsivo", contrapposto al classico "modo iterativo" (mediante un ciclo 'for').

    Che cosa sono le "funzioni ricorsive"?

    Cerca con Google: "ricorsione", "funzione ricorsiva", "esempi funzione ricorsiva", ecc..

    Mettila in questo modo: quasi (ma anche senza 'quasi') tutto quello che puoi fare con i cicli (while, for, ...), lo puoi fare con la "ricorsione" (con opportuni rimaneggiamenti ).
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    migliorabile ha scritto:


    Mettila in questo modo: quasi (ma anche senza 'quasi') tutto quello che puoi fare con i cicli (while, for, ...), lo puoi fare con la "ricorsione" (con opportuni rimaneggiamenti ).
    Senza "quasi", tutto quello che puoi fare con la ricorsione puoi farlo senza, iterativamente, anche più efficientemente.
    E' solo che certi problemi sono "lunghi e difficili" (da codificare iterativamente), mentre "facili" ricorsivamente.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    smalldragon ha scritto:


    Appunto hai capito cosa ti devo spiegare?
    il punto che il professore voleva farvi capire l'approccio ricorsivo tramite la chiamata alla funzione.
    Guarda che il post non l'ho creato io. Di ricorsione credo di capirne un pochino… E a mio avviso da un punto di vista formale quello che hai detto non è corretto. Per la definizione stessa di fattoriale. Tutto qui!

    Per far capire la chiamata a funzione, forse bisognerebbe, e spero sia fatto, spiegare cose ben più importanti…

    Saluti...
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    migliorabile ha scritto:


    @RafSa: il codice proposto e' QUASI giusto!

    C'e' un "refuso": al prof gli e' scappato un "<= 2" invece di un "< 2".

    A parte questa "svista", il codice e' assolutamente corretto.

    Si tratta dell'implementazione della funzione "fattoriale" fatta in "modo ricorsivo", contrapposto al classico "modo iterativo" (mediante un ciclo 'for').

    Che cosa sono le "funzioni ricorsive"?

    Cerca con Google: "ricorsione", "funzione ricorsiva", "esempi funzione ricorsiva", ecc..

    Mettila in questo modo: quasi (ma anche senza 'quasi') tutto quello che puoi fare con i cicli (while, for, ...), lo puoi fare con la "ricorsione" (con opportuni rimaneggiamenti ).
    Beh aggiungo, tanto per dare i pareri più ampi, sul problema sollevato, che a mio avviso da un punto squisitamente formale il <2 non è precisa. Credo che da un punto di vista matematico sia più chiara usare una delle due condizione


    if(n<=1)
    {
    return 1;
    }


    oppure

    if(n==0)
    {
    return 1;
    }

    Poi uno sceglie la forma che preferisce, ma credo che da un punto di vista matematico sia migliore, considerando anche che il fattoriale di zero è dato per definizione pari a 1.

    Sono perfettamente d'accordo su fatto che tutto ciò che può essere fatto con la ricorsione possa essere fatto in maniera iterativa. Occorre valutare da caso a caso: preferibile la sintesi e la semplicità del codice o è preminente l'aspetto delle performance?

    Un saluto.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    deckard ha scritto:


    ...
    Sono perfettamente d'accordo su fatto che tutto ciò che può essere fatto con la ricorsione possa essere fatto in maniera iterativa...
    ...anche (e soprattutto) perchè la ricorsione, semplicemente non esiste sulle macchine fisiche (qui si aprirebbe il pippone su assembly imperativo, o addirittura su insiemi finiti e quindi ricorsivi di memoria)
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    +m2+ ha scritto:


    deckard ha scritto:


    ...
    Sono perfettamente d'accordo su fatto che tutto ciò che può essere fatto con la ricorsione possa essere fatto in maniera iterativa...
    ...anche (e soprattutto) perchè la ricorsione, semplicemente non esiste sulle macchine fisiche (qui si aprirebbe il pippone su assembly imperativo, o addirittura su insiemi finiti e quindi ricorsivi di memoria)
    Beh, alla fine credo tutto poggi sul concetto di insieme enumerabile. Ma onestamente sono troppo lontani i miei studi in merito Alla fine esiste la "ricorsione" se dato un elemento di un insieme I passato a una funzione potrà terminare, altrimenti non siamo in presenza di un insieme enumerabile. Ovviamente +m3+ le tue riflessioni sono sempre di altissimo livello. Penso che la tua affermazione sulla non esistenza di ricorsione sulle macchine fisiche sia dovutala a come viene strutturata la memoria al momento della creazione del record di attivazione di una funzione. Ma qui mi fermo e potrei solo cederti, anche ben volentieri, la parola.

    Complimenti, sempre un piacere leggerti.
  • Re: Codice esempio sbagliato a lezione ma il docente afferma di no

    Grazie a tutti per le info .... alla fine a lezione si è scusato e ha corretto con un <=1 .
Devi accedere o registrarti per scrivere nel forum
15 risposte