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

    [C] Funzione e valore di ritorno

    Salve ragazzi, premetto che odio la ricorsione, quindi faccio un pò fatica a capirla. Stavo appunto cercando di fare il calcolo della potenza, tramite una funzione ricorsiva, dopo essere spremuto le meningi senza risultati per giorni, ho trovato in rete un'ottima soluzione, ovvero questa:
    codice:
    int pot(int n, int esp)
    {
    
    	if(!esp)
    		return 1;
    
    	else
    
    		return n*pot(n,esp-1);
    }
    La funzione funziona correttamente, ma non ho capito nel else quando il valore ritornato dalla funzione, viene poi usato per fare il prodotto con la n. La cosa strana è questa, chiamando la funzione pot con i suoi argomenti, come può ritornare un valore, avendo solo semplicemente chiamato la funzione, senza aver fatto nessun calcolo?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C] Funzione e valore di ritorno

    Originariamente inviato da GiulioCesare
    Salve ragazzi, premetto che odio la ricorsione, quindi faccio un pò fatica a capirla. Stavo appunto cercando di fare il calcolo della potenza, tramite una funzione ricorsiva, dopo essere spremuto le meningi senza risultati per giorni, ho trovato in rete un'ottima soluzione, ovvero questa:
    codice:
    int pot(int n, int esp)
    {
    
    	if(!esp)
    		return 1;
    
    	else
    
    		return n*pot(n,esp-1);
    }
    La funzione funziona correttamente, ma non ho capito nel else quando il valore ritornato dalla funzione, viene poi usato per fare il prodotto con la n. La cosa strana è questa, chiamando la funzione pot con i suoi argomenti, come può ritornare un valore, avendo solo semplicemente chiamato la funzione, senza aver fatto nessun calcolo?
    In effetti la ricorsione ti confonde ...

    Riformula la domanda ...

  3. #3
    La mia domanda era rivolta al fatto, di quale valore andava al moltiplicarsi con n della funzione. Forse dovrebbe essere 1, che è il valore che viene ritornato alla funzione, quando l'esponente arriva a zero, e poi dovrebbe calcolarsi tutte le altre funzioni rimaste in sospeso. Certo che è un bel bordello VVoVe:

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Forse non conosci bene come funziona uno stack ...

    E' la soluzione del mistero ...

  5. #5
    Beh sicuramente, visto che non so nemmeno cosa sia una stack, sapresti spiegarmelo?

  6. #6
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    la prima volta vedere una funzione o un metodo ricorsivo lascia spiazzati, cmq qui: http://www.cli.di.unipi.it/~acorradi...ione/main.html

    Spiegano semplicemente come funziona lo stak e i vari tipi di ricorsione

    Secondo me però come esempio della ricorsione è più facile la ricerca file(uso pseudo-codice):

    codice:
    void boolean cerca(file path, file dacercare) {
    lista[] = path.getLista();
    for(int i = 0; i < lista.length; i++) {
    if(lista[i] è una cartella) {
    cerca(lista[i], dacercare);//ricorsione, richiama per ogni sotto/cartella
    }
    else {//quindi è un file
    if(lista[i] == dacercare) return true;
    }
    }
    return false;
    }
    facendo cerca("/", "nomefile");

    lo cerca(o circa, il concetto è quello ).

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  7. #7
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    come dice oregon devi vederti il funzionamento dello stack...
    ricorsione e stack vanno a braccetto

    ogni volta che chiami la funzione è come se mettessi un mattoncino sullo stack tipo(se chiami 2^5):

    pot(2,5) = :2*pot(2,4):
    pot(2,4) = :2*pot(2,3):
    pot(2,3) = :2*pot(2,2):
    pot(2,2) = :2*pot(2,1):
    pot(2,1) = :2*pot(2,0):
    pot(2,0) = 1 (caso base) e ritornando in alto(o in basso!!) nello stack si viene a ricostruire il valore di pot(2,5) andando a prelevare i "blocchetti" nello stack con i ritorni di funzioni di più "basso livello"...
    pot(2,5) è 32. prova a farlo partendo dal basso verso l'alto!!!
    non so se mi sono spiegato!
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

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.