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.