leggere array in avanti

Messaggioda del_ta » 11/09/2018, 14:59

Ciao ragazzi! Sto cercando di risolvere un esercizio che mi chiede di stampare il contenuto degli indici dispari(in ordine crescente)di un array con una funzione del tipo: void dispari(int x[],int n) con x il vettore ed n la dimensione. Il problema è che non riesco a leggere il vettore in avanti. Come posso fare?
Grazie.
del_ta
Junior Member
Junior Member
 
Messaggio: 113 di 242
Iscritto il: 01/12/2015, 11:50

Re: leggere array in avanti

Messaggioda vict85 » 11/09/2018, 15:05

È sufficiente usare un ciclo. Sai cosa sono i cicli?
vict85
Moderatore
Moderatore
 
Messaggio: 9374 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: leggere array in avanti

Messaggioda del_ta » 11/09/2018, 15:48

vict85 ha scritto:È sufficiente usare un ciclo. Sai cosa sono i cicli?

Sisi certo. Scusa ma mi sono sbagliato io.La funzione deve essere ricorsiva,per questo non riesco a usare un ciclo.
del_ta
Junior Member
Junior Member
 
Messaggio: 114 di 242
Iscritto il: 01/12/2015, 11:50

Re: leggere array in avanti

Messaggioda apatriarca » 12/09/2018, 00:17

Un primo metodo consiste nell'usare una funzione ricorsiva di appoggio void dispari2(int x[], int i, int n) che richiama se stessa con un valore crescente di i fino a raggiungere n. In questo caso il corpo della tua funzione sarà semplicemente dispari2(x, 1, n)..

Un secondo metodo consiste nell'osservare che esistono due momenti in una chiamata ricorsiva: quello precedente alla chiamata ricorsiva e quello successivo. Il codice prima della chiamata ricorsiva viene eseguito in ordine dalla chiamata "meno profonda" a quella "più profonda", mentre il codice dopo la chiamata ricorsiva viene eseguito in ordine inverso. La soluzione in questo caso è quindi quella di stampare dopo la chiamata ricorsiva. Qualcosa come segue (pseudocodice simil python):
Codice:
def dispari(x, n):
    if n > 0:
        dispari(x, n-1)              # Chiamata ricorsiva..
        if isOdd(n):                 # Stampa se l'indice è dispari
            print x[n]
apatriarca
Moderatore
Moderatore
 
Messaggio: 5116 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: leggere array in avanti

Messaggioda del_ta » 12/09/2018, 10:16

apatriarca ha scritto:Un primo metodo consiste nell'usare una funzione ricorsiva di appoggio void dispari2(int x[], int i, int n) che richiama se stessa con un valore crescente di i fino a raggiungere n. In questo caso il corpo della tua funzione sarà semplicemente dispari2(x, 1, n)..

Un secondo metodo consiste nell'osservare che esistono due momenti in una chiamata ricorsiva: quello precedente alla chiamata ricorsiva e quello successivo. Il codice prima della chiamata ricorsiva viene eseguito in ordine dalla chiamata "meno profonda" a quella "più profonda", mentre il codice dopo la chiamata ricorsiva viene eseguito in ordine inverso. La soluzione in questo caso è quindi quella di stampare dopo la chiamata ricorsiva. Qualcosa come segue (pseudocodice simil python):
Codice:
def dispari(x, n):
    if n > 0:
        dispari(x, n-1)              # Chiamata ricorsiva..
        if isOdd(n):                 # Stampa se l'indice è dispari
            print x[n]

Perfetto, con il caso della stampa ho capito. Ma se invece volessi moltiplicare gli indici dispari usando il secondo metodo?
Grazie mille per l'aiuto!
del_ta
Junior Member
Junior Member
 
Messaggio: 115 di 242
Iscritto il: 01/12/2015, 11:50

Re: leggere array in avanti

Messaggioda apatriarca » 12/09/2018, 10:36

Moltiplichi il valore restituito dalla funzione per 1 se è un indice pari o l'elemento se è dispari.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5118 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: leggere array in avanti

Messaggioda del_ta » 12/09/2018, 14:18

apatriarca ha scritto:Moltiplichi il valore restituito dalla funzione per 1 se è un indice pari o l'elemento se è dispari.

Ho pensato qualcosa del genere:
Codice:
int molt_dispari(int x[],int n){
     if(n>0){
         if(n%2!=0) return molt_dispari(x,n-1)*x[n];
          else return molt_dispari(x,n-1);
     }
     if(n==0) return 1;}

Che ne pensi?Può andare?
del_ta
Junior Member
Junior Member
 
Messaggio: 116 di 242
Iscritto il: 01/12/2015, 11:50

Re: leggere array in avanti

Messaggioda apatriarca » 12/09/2018, 14:55

Userei un "else" al posto della condizione "n == 0", ma l'idea è quella.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5120 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: leggere array in avanti

Messaggioda del_ta » 12/09/2018, 15:04

apatriarca ha scritto:Userei un "else" al posto della condizione "n == 0", ma l'idea è quella.

Ok,bene! E se invece li voglio valutare in senso inverso? Non so se mi sono spiegato ma l'esercizio mi chiede di scrivere 2 versioni della funzione: una che moltiplica i dispari in ordine di inserimento del vettore (dall’indice più piccolo all’indice
più grande) e l’altra viceversa. Come si può fare?
del_ta
Junior Member
Junior Member
 
Messaggio: 117 di 242
Iscritto il: 01/12/2015, 11:50

Re: leggere array in avanti

Messaggioda apatriarca » 12/09/2018, 19:51

Se ti interessa semplicemente cambiare l'ordine degli operandi è allora sufficiente scrivere molt_dispari(x, n-1)*x[ n ] o x[ n ] * molt_dispari(x, n-1). Altrimenti è necessario usare delle funzioni intermedie.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5121 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite