PDA

Visualizza la versione completa : [C++] Esercizio funzione ricorsiva: somma pari e dispari alternata


mistergks
22-03-2011, 01:23
Si scriva in C++ una funzione ricorsiva che riceva un array di numeri interi e la sua dimensione e restituisca TRUE se le somme di due interi consecutivi nell’array sono alternatamente una pari ed una dispari, ossia comunque si prenda un intero x nell’array, se la somma di x con l’intero che lo precede è pari (risp. dispari), la somma di x con l’intero che lo segue deve essere dispari (risp. pari). Esempio: la funzione invocata su un array contenente la sequenza di interi 1 3 2 6 3 3 2 dovrà restituire TRUE. Infatti le somme degli interi consecutivi sono 1+3 - pari, 3+2 – dispari, 2+6 – pari, 6+3 – dispari, 3+3 – pari, 3+2 – dispari.
Specificare quale deve essere la prima invocazione per la funzione.


La mia bozza di soluzione è:




bool parialternati(int M[], int dim, int i){

if(dim%2==0) //passo base
return false;


if(M[i] + M[i+1]%2==0 && M[i+2] + M[i+3]%2!=0) //passo ricorsivo
return true;

return parialternati(M[], dim, ++i);
}


La prima invocazione per la funzione deve essere:
parialternati(M, dim, 1);




Cosa sbaglio? C'è un altro modo per farlo senza far camminare l'indice i di cosi' tanto?

VincenzoTheBest
22-03-2011, 07:44
Originariamente inviato da mistergks
Cosa sbaglio?

Di sicuro il passo base.

Originariamente inviato da mistergks
C'è un altro modo per farlo senza far camminare l'indice i di cosi' tanto?
Si, pensaci bene..

mistergks
22-03-2011, 19:28
il passo base non so proprio come fare per individuarlo..:( :dhò:
per quello ricorsivo va bene se faccio scorrere l'indice ogni 2? cioè incremento di 2??

VincenzoTheBest
22-03-2011, 20:03
Originariamente inviato da mistergks
il passo base non so proprio come fare per individuarlo..:( :dhò:

Ragiona sul fatto che devi scorrere per intero l'array e quindi al di fuori di [0, dim) non puoi andare.

Originariamente inviato da mistergks
per quello ricorsivo va bene se faccio scorrere l'indice ogni 2? cioè incremento di 2??
In questo caso ti conviene far partire l'indice da 1 ed incrementarlo progressivamente di una sola unità.

P.S. Nella segnatura della tua funzione manca un parametro.

mistergks
23-03-2011, 13:26
Ho corretto il passo base e ho cambiato la condizione dell'if perchè anche la seconda espressione deve sommare M[i+1].
Qual'è il parametro che manca?! Non mi sembra .. ho messo la matrice M, la sua dimensione e l'indice i.




bool parialternati(int M[], int dim, int i){

if(i==dim) //passo base
return false;


if(M[i] + M[i+1]%2==0 && M[i+1] + M[i+2]%2!=0) //passo ricorsivo
return true;

return parialternati(M[], dim, ++i);
}


La prima invocazione nel main per la funzione deve essere:
parialternati(M, dim, 1);


Come prima invocazione ho assegnato i a 1 passando un 1 direttamente nella funzione. Cosi' facendo non bisogna obbligatoriamente specificare i=1 nell'inizializzazione del main, vero?

VincenzoTheBest
23-03-2011, 15:01
Originariamente inviato da mistergks
Ho corretto il passo base e ho cambiato la condizione dell'if perchè anche la seconda espressione deve sommare M[i+1].
Qual'è il parametro che manca?! Non mi sembra .. ho messo la matrice M, la sua dimensione e l'indice i.

Innanzitutto M non è una matrice, bensì un array.
Poi la soluzione non è effettivamente corretta: se M fosse grande 3 otterresti un errore a run time, quindi puoi trovare sicuramente una soluzione diversa.
Terza cosa: per come hai definito la funzione, l'indice i deve partire da 0, altrimenti non verifichi la prima somma.

Per quanto riguarda il parametro aggiuntivo, penso sia meglio esplicitare (usando appunto un parametro) come la sequenza di resti deve iniziare, perchè la traccia dice:

Specificare quale deve essere la prima invocazione per la funzione.

mistergks
24-03-2011, 23:24
Originariamente inviato da VincenzoTheBest
Innanzitutto M non è una matrice, bensì un array.

E' vero!l' ho chiamata matrice per cattiva abitudine...ma so che la matrice è formata da righe e colonne mentre questo array ha solo una riga... sorry!



Poi la soluzione non è effettivamente corretta: se M fosse grande 3 otterresti un errore a run time, quindi puoi trovare sicuramente una soluzione diversa.

Cosa dovrei fare? un controllo con un if cosi magari?:


if(dim<4)
return false;



Terza cosa: per come hai definito la funzione, l'indice i deve partire da 0, altrimenti non verifichi la prima somma.

Ah è vero!



Per quanto riguarda il parametro aggiuntivo, penso sia meglio esplicitare (usando appunto un parametro) come la sequenza di resti deve iniziare, perchè la traccia dice:
Ma cosa si intende per prima invocazione? La traccia vuole sapere come viene chiamata la funzione nel main? o Cosa? non ho ben capito!

VincenzoTheBest
25-03-2011, 13:11
Originariamente inviato da mistergks
Cosa dovrei fare? un controllo con un if cosi magari?

Cerca di confrontare al più due celle, e non quattro.

Originariamente inviato da mistergks
Ma cosa si intende per prima invocazione? La traccia vuole sapere come viene chiamata la funzione nel main? o Cosa? non ho ben capito!
Non so, io ho dato quella interpretazione.

mistergks
25-03-2011, 13:22
Non riesco ad arrivarci...se confronto solo due celle come faccio a dire che la prima somma deve essere pari e la seconda dispari?!

mistergks
26-03-2011, 18:26
up

Loading