|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[C++] Funzione ricorsiva: somma pari-dispari
Ho un problema con la seguente funzione.. non riesco a capire cosa c'è che non va.. mi stampa sempre false...
Ecco la specifica: 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. Codice:
#include <iostream>
using namespace std;
bool ricorsiva(int v[], int dim, int i);
int main(){
int i=0;
const int dim=7;
int v[dim]={1,3,2,6,3,3,2};
if(ricorsiva(v,dim,i)){
cout<<"ok"<<endl;
}
else{
cout<<"no"<<endl;
}
system("pause");
return 0;
}
bool ricorsiva(int v[], int dim, int i){
if(i==dim-3)
return true;
if(v[i] + v[i+1] % 2 == 0 && v[i+1] + v[i+2] % 2 == 0)
return false;
if(v[i] + v[i+1] % 2 != 0 && v[i+1] + v[i+2] % 2 != 0)
return false;
return ricorsiva(v,dim,i++);
}
Ultima modifica di mistergks : 30-10-2011 alle 02:33. Motivo: aggiunta |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
ciao, ci son diversi errori, prima di tutto le condizioni sono ambigue, cioè la precedenza tra gli operatori logici/matematici non è specificata. Quindi vanno corrette es:
Codice:
if(v[i] + v[i+1] % 2 == 0 && v[i+1] + v[i+2] % 2 == 0) Codice:
if(((v[i] + v[i+1]) % 2 == 0) && ((v[i+1] + v[i+2]) % 2 == 0)) Codice:
return ricorsiva(v,dim,i++); ciao
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Grazie mille per la risposta! Ho fatto le correzioni, ma ancora non va! ecco la funzione corretta: Codice:
bool ricorsiva(int v[], int dim, int i){
if(i==dim-3)
return true;
if((v[i] + v[i+1] % 2 == 0) && (v[i+1] + v[i+2] % 2 == 0))
return false;
if((v[i] + v[i+1] % 2 != 0) && (v[i+1] + v[i+2] % 2 != 0))
return false;
return ricorsiva(v,dim,++i);
}
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Non hai veramente applicato quanto suggerito da starfred: hai trascurato delle parentesi importanti per dare precedenza alla somma rispetto al resto intero.
Inoltre considero preferibile ridurre al minimo i confronti e gli elementi coinvolti nelle condizioni (senza arrivare all'illeggibilità). Ripensando l'esercizio perseguendo questo obiettivo lo scriverei così:
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Codice:
if((v[i] + v[i+1]) % 2 == 0 && (v[i+1] + v[i+2]) % 2 == 0)
return false;
if((v[i] + v[i+1]) % 2 != 0 && (v[i+1] + v[i+2]) % 2 != 0)
return false;
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Una condizione: la parità della somma dell'elemento più quello successivo
Codice:
( ( v[i] + v[i + 1] ) % 2 ) Codice:
( i % 2 )
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
però non capisco il nesso con l'indice... devo controllare solo gli indici pari nel primo if e quelli dispari nel secondo?! Sarebbe un discorso di efficienza? |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:35.




















