Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Funzione ricorsiva

  1. #1
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182

    Funzione ricorsiva

    Ciao,
    ho questa funzione che lavora su stack (e fa una somma sugli elementi),non riesco a capire come faccia a ricreare lo stack la funzione push in quanto è fuori dalla ricorsione.
    Grazie

    codice:
    int somma(stack s){
        int x, sum;
        if (isEmptyStack(s)) return 0;
        x=pop(s);
        sum=somma(s)+x;
        push(s,x);
        return sum;
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    La push non è fuori dalla ricorsione... è solo richiamata dopo che è stato eseguito l'n-esimo passo ricorsivo... ad ogni passo (quindi, anche nei passi ricorsivi).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    Uhmm..non mi è chiara questa cosa...ma la push non viene invocata quando ormai la catena delle chiamate ricorsive si è "riavvolta"ed ha sommato i valori memorizzandoli in sum?

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: Funzione ricorsiva

    Dopo il pop viene fatto nuovamente un push di x, quindi lo stack rimane inalterato proprio perché i valori vengono rimessi dentro lo stack.
    Lo stack prima si svuota, poi quando l' ultima chiamata (quella in cui isEmptyStack(s) ritorna true) termina viene ripopolato con i push.Se il push lo mettessi prima di sum=somma(s)+x la funzione non terminerebbe mai.
    Se vuoi vedere meglio come accadono le cose ti consiglio di usare del breakpoint per vedere passo passo cosa succede.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da felpone
    Uhmm..non mi è chiara questa cosa...ma la push non viene invocata quando ormai la catena delle chiamate ricorsive si è "riavvolta"ed ha sommato i valori memorizzandoli in sum?
    Sì, ma tu stai guardando solo il primo passo. Quello che hai detto vale per tutti i passi successivi, ovvero, in tutti i passi successivi viene tolto un elemento, sommato e poi rimesso l'elemetno al suo posto. La chiamata alla funzione "somma" lascia inalterato lo stack che le viene passato. Quindi, al passo N, tolgo un elemento, chiamo "somma" (che, ripeto, lascia inalterato lo stack) e poi rimetto dentro l'elemento tolto (lasciando, ancora, inalterato lo stack).

    Esempio pratico con uno stack di 3 elementi:

    codice:
    chiamo somma(stack[1 2 3])
    Stack vuoto?
    NO: tolgo il 3; stack = [1 2]
    chiamo somma(stack[1 2])
        01) Stack vuoto?
            NO: tolgo il 2; stack = [1]
            chiamo somma(stack[1])
            02) Stack vuoto?
                NO: tolgo 1; stack = []
                chiamo somma(stack[])
                03) Stack vuoto?
                    SI: lascio tutto inalterato e torno 0
                sum = 0 + 1
                push(stack, 1); stack = [1]
                ritorno 1;
            sum = 1 + 2
            push(stack, 2); stack = [1 2]
            ritorno 3
        sum = 3 + 3
        push(stack, 3); stack = [1 2 3]
        ritorno 6
    Valore finale = 6
    E stack inalterato
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    Ok,quindi la push viene invocata ad ogni "riavvolgimento" delle chiamate ricorsive precedentemente srotolate?

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da felpone
    Ok,quindi la push viene invocata ad ogni "riavvolgimento" delle chiamate ricorsive precedentemente srotolate?
    Bel modo di vederla Si in effetti è proprio così.

  8. #8
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    Io la vedo così ma non mi convince. In effetti la push è chiamata solamente quando si "riavvolge" tutte le chiamate ricorsive(la riga dell'istruzione push è scritta dopo la chiamata ricorsiva),quindi non capisco come faccia la push a prendere ogni elemento e inserirlo nello stack!

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.