Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C++] Programma ricorsivo

    Ciao a tutti.
    Sto cercando di rifare un po' di vecchi esami per preparare il mio e mi sono imbattuto in un programmino che non riesco proprio a capire.

    Dovrei dire cosa visualizza a schermo e dare un nome alle due funzioni (in particolare capire cosa fanno matematicamente)...

    Il programma è il seguente:

    codice:
    #include <iostream>
    using namespace std;
    
    int f(int x, int y)
    {
        if(y <= 0) return x;
        return f(x+1, y-1);
    }
    
    int g(int x, int y)
    {
        if(y <= 1) return x;
        return f(x, g(x, y-1));
    }
    
    int main ()
    {
        cout << g(6, 3) << endl;
    
        return 0;
    }
    Qualcuno può aiutarmi please?
    GRazie.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Forse ritorna gli 0 di una funzione
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Originariamente inviato da linoma
    Forse ritorna gli 0 di una funzione
    Si?
    Potresti spiegarmi passo per passo a come si arriva a tale conclusione please?

    Ho qualche problema a capire cosa fanno le funzioni ricorsive (malgrado abbia capito il concetto...).

    Infatti nell'esame dell'anno dopo ne ho trovata una simile e mi sono bloccato nuovamente.

    codice:
    int f(int a, int b)
    {
         if (a < 1) return b;
         else return f(a-1, a*b);
    }
    Anche in questo caso devo spiagare cosa fa e dare una versione non ricorsiva. Domanda: se nel test non capisco cosa fa una funzione ricorsiva, c'è comunque un modo (un "algoritmo") per arrivare a trovare quella iterativa equivalente?
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Restituisce il prodotto dei due valori passati
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Pare che chiedere spiegazioni sia fuori regolamento. In verita ho buttato ad indovinare
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Originariamente inviato da linoma
    Pare che chiedere spiegazioni sia fuori regolamento. In verita ho buttato ad indovinare
    Fuori regolamento? -.-

    Comunque a me non interessa tanto cosa fa questo programma in particolare, ma capire come abbordare in generale questo tipo di problema...
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  7. #7
    Originariamente inviato da oregon
    Restituisce il prodotto dei due valori passati
    In pratica richiama inutilmente sé stessa a volte, calcolando ogni volta il prodotto e poi restituendo questo risultato alla funzione precedente, che lo restituisce a sua volta fino ad arrivare alla prima funzione chiamante?

    Se è così ora lo vedo, ma nel primo esempio ancora non capisco...
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: [C++] Programma ricorsivo

    Partiamo da questa:

    codice:
    #include <iostream>
    using namespace std;
    
    int f(int x, int y)
    {
        if(y <= 0) return x;
        return f(x+1, y-1);
    }
    Restituisce la somma tra x e y, ma solo se y>0.
    Altrimenti restituisce x.
    Il perchè sta nel codice, tradotto significa:
    "Se y non è positivo ritorna x, altrimenti incrementa x y volte e ritorna x"

    Questa:

    codice:
    int g(int x, int y)
    {
        if(y <= 1) return x;
        return f(x, g(x, y-1));
    }
    Questa è la funzione moltiplicazione, ma funziona solo se y>1.
    Se y>1 ritorna la somma di x più la moltiplicazione di x per y-1.
    Il che equivale a dire che ritorna la moltiplicazione tra x e y, perchè quando y sarà 1, a x gli avrai sommato x y-1 volte.
    Ti faccio un esempio:
    Ho g(4,3) -> f(4, f(4,g(4,2)) -> f(4, f(4,f(4,g(4,1))))
    g(4,1) = 4, allora g(4,3) = f(4, f(4,4)) = f(4,8) = 12.

    codice:
    int main ()
    {
        cout << g(6, 3) << endl;
    
        return 0;
    }
    Nel main stampa la moltiplicazione tra 6 e 3, se non erro dovrebbe stampare 18, prova a compilarlo e fammi sapere il risultato.

  9. #9

    Re: Re: [C++] Programma ricorsivo

    Originariamente inviato da ramy89
    Partiamo da questa:

    codice:
    #include <iostream>
    using namespace std;
    
    int f(int x, int y)
    {
        if(y <= 0) return x;
        return f(x+1, y-1);
    }
    Restituisce la somma tra x e y, ma solo se y>0.
    Altrimenti restituisce x.
    Il perchè sta nel codice, tradotto significa:
    "Se y non è positivo ritorna x, altrimenti incrementa x y volte e ritorna x"

    Questa:

    codice:
    int g(int x, int y)
    {
        if(y <= 1) return x;
        return f(x, g(x, y-1));
    }
    Questa è la funzione moltiplicazione, ma funziona solo se y>1.
    Se y>1 ritorna la somma di x più la moltiplicazione di x per y-1.
    Il che equivale a dire che ritorna la moltiplicazione tra x e y, perchè quando y sarà 1, a x gli avrai sommato x y-1 volte.
    Ti faccio un esempio:
    Ho g(4,3) -> f(4, f(4,g(4,2)) -> f(4, f(4,f(4,g(4,1))))
    g(4,1) = 4, allora g(4,3) = f(4, f(4,4)) = f(4,8) = 12.

    codice:
    int main ()
    {
        cout << g(6, 3) << endl;
    
        return 0;
    }
    Nel main stampa la moltiplicazione tra 6 e 3, se non erro dovrebbe stampare 18, prova a compilarlo e fammi sapere il risultato.
    Si, si. Avevo già provato a compilarlo e stampa proprio 18. Quindi ho immaginato che fosse 6 * 3, ma non ero riuscito a vedere che stampava 18 sulla carta. Però il metodo che hai usato (scrivere proprio tutte le funzioni) non è male! È un vero macello se i numeri sono grandi, ma così sembraun'ottimo moto, così si risolve sal più interno al più esterno con "facilità".
    È il metodo con cui procedere? (E se da numeri grandi io la scomposizione la faccio comunque su numeri piccoli!)
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  10. #10
    Altro programma...
    (Ormai ho capito che la recursione gli piace assai e che sicuramente ci sarà all'esame... -.-)

    codice:
    #include <iostream>
    using namespace std;
    
    bool f(int nombre);
    
    bool g(int nombre)
    {
        if(nombre == 0) return true;
        else return f(nombre-1);
    }
    
    bool f(int nombre)
    {
        if(nombre == 1) return true;
        else return g(nombre-1);
    }
    
    int main ()
    {
        int nombre(4);
        
        cout << "Nombre entier: " << endl;
        cin >> nombre;
        
        if(g(nombre)) cout << nombre << " est ...(A)..." << endl;
        if(f(nombre)) cout << nombre << " est ...(B)..." << endl;
        
        return 0;
    }
    Mi è venuta l'illuminazione e direi che dice se un numero è pari o dispari, quindi (A)=pari, (B)=dispari.

    Però mi è proprio venuta così, a pelo. Non so se é giusta e nel caso lo fosse, comunque, il mio problema persiste...!
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

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