PDA

Visualizza la versione completa : [C] Problema Vettori e Ricorsione!


DarkDevil666
01-12-2008, 19:34
Ho un esercizio di questo tipo:

Scrivere una funzione RICORSIVA in linguaggio C, con prototipo
void somma_prefissi( long [], int );
in grado di leggere una sequenza di lunghezza indefinita (comunque minore di 100 elementi)
di interi positivi che terminino con il valore -1 come sentinella. Si deve salvare nel vettore in
input nella cella i il valore della somma parziale dei primi i + 1 elementi. La funzione deve
anche salvare il valore -1 come sentinella nell’array.
Scrivere quindi un programma completo che dichiari le variabili opportunamente e stampi
i valori del vettore calcolati dalla funzione somma_prefissi, separati da UNO spazio o da
UN carattere di nuova riga. All’interno della funzione somma_prefissi vengono calcolate le
somme e salvate nel vettore mentre all’interno della funzione main tale vettore ` stampato
e
come descritto sopra (tutti gli elementi separati da UNO spazio o da UN carattere di nuova
riga).
Esempio: Se l’input ` e
1 2 3 4 5 6 10 12 -1
il programma deve stampare
1 3 6 10 15 21 31 43

Non so propio dove mettere le mani dato che non ho capito come usare la ricorsione..qlkn puo gentilmente illuminarmi?

Von_Neumann2
01-12-2008, 21:00
Guarda noi l'abbiamo fatta da poco spero di esserti utile... una funzione ricorsiva è una funzione che richiama se stessa, ogni volta "semplificando" l'argomento della funzione richiamata in modo da tornare, in un numero finito di passaggi, ad un caso base (esempio famosissimo è il fattoriale).

Per il problema io ti consiglio, dopo aver dichiarato il vettore, di leggere in input ogni valore e associarlo ad un indice del vettore, e trovare alla fine il -1 in che posizione è nel vettore.
Ti troverai (con un opportuno if) che v[k+1] = -1 ; a questo punto innesti un ciclo decrescente dove v[k] = v[k] + v[k-1] + ... + v[0] e similmente per gli altri. Partendo dalla fine eviti praticamente tutti i problemi che si possono creare dal fatto che i valori si modificano.

Infine stampi gli elementi fino a v[k], per lo spazio basta lasciare uno spazio dentro le virgolette. Per andare a capo ogni 10 invece (che fa sempre figo :D) metti dentro il ciclo che farai per stampare ' if (i%10 == 0) printf("\n") ' [dove i è il contatore del ciclo] che rende tutto più carino.

DarkDevil666
01-12-2008, 22:14
il fatto è che non riesco proprio a capire come far funzionare la ricorsione in questo esercizio...
finchè parliamo di Serie di Fibonacci e Fattoriali ok..ma in questo caso non so proprio dove mettere le mani

MacApp
02-12-2008, 01:10
Originariamente inviato da DarkDevil666
il fatto è che non riesco proprio a capire come far funzionare la ricorsione in questo esercizio...
finchè parliamo di Serie di Fibonacci e Fattoriali ok..ma in questo caso non so proprio dove mettere le mani
Ogni problema ricorsivo puo' essere "tradotto" in non ricorsivo e viceversa. Quindi dove sta il problema?
Considera che generalmente gli essere umani utilizzano naturalmente algoritmi ricorsivi.
;-)

DarkDevil666
02-12-2008, 17:47
eh lo so....infatti con l'iterazione nn sarebbe un problema risolvere l'esercizio..ma purtroppo devo usare la ricorsione.
sono disperato :cry: :cry: :cry: :cry: :cry: :cry:

Vincenzo1968
03-12-2008, 15:01
void somma_prefissi( long a[], int n )
{
if ( n < 1 || a[n] == -1 )
return;

a[n] = a[n-1] + a[n];

somma_prefissi(a, n+1);
}

int main()
{
int k;
long a[] = {1, 2, 3, 4, 5, 6, 10, 12, -1};

somma_prefissi(a, 1);

for(k = 0; a[k] != -1; k++)
printf("%d ", a[k]);

return 0;
}


:ciauz:

Loading