View Full Version : [c++] funzione ricorsiva definita come segue
mistergks
09-03-2012, 13:52
Sia A l'insieme ricorsivo di numeri naturali definito come segue:
0 non appartiene ad A
1 appartiene ad A
X appart. ad A se e solo se (3x-2)/6 appartiene ad A, per ogni x>1
Si scriva in C++ una funzione ricorsiva che verifichi se un dato numero appartiene o meno all'insieme A.
Specificare quale deve essere la prima invocazione per la funzione.
NOTA: La divisione si intende fra interi (non negativi), quindi da approssimare per difetto.
cos'è che non va?
mio codice
#include <iostream>
using namespace std;
bool verifica(int x);
int main(){
int x=5;
if(verifica(x))
cout<<"ok"<<endl;
else
cout<<"no"<<endl;
system("pause");
return 0;
}
bool verifica(int x){
int xx=0;
if(x == 0 || xx == 0)
return false;
if(x == 1 || xx == 1)
return true;
if(x > 1)
xx=(3*x-2)/6;
return verifica(xx);
}
ESSE-EFFE
09-03-2012, 14:31
Sia A l'insieme ricorsivo di numeri naturali definito come segue:
Cioè come?
mistergks
09-03-2012, 20:10
C'è stato un errore di copia incolla..ora ho messo la definizione..
Inviato dal mio GT-I9003 usando Tapatalk
vendettaaaaa
10-03-2012, 01:35
Sia A l'insieme ricorsivo di numeri naturali definito come segue:
0 non appartiene ad A
1 appartiene ad A
X appart. ad A se e solo se 3x-2/6 appartiene ad A
Si scriva in C++ una funzione ricorsiva che verifichi se un dato numero appartiene o meno all'insieme A.
Specificare quale deve essere la prima invocazione per la funzione.
NOTA: La divisione si intende fra interi (non negativi), quindi da approssimare per difetto.
cos'è che non va?
mio codice
#include
using namespace std;
bool verifica(int x);
int main(){
int x=5;
if(verifica(x))
cout<<"ok";
else cout<<"no";
return 0;
}
bool verifica(int x){
int xx= 0;
if(x == 0 || xx ==0)
return false;
if(x == 1 || xx == 1)
return true;
xx=(3*x-2)/6;
return verifica(xx);
}
Non ho ben capito la definizione...devo ricorsivamente applicare la formula fino a che il mio numero x diventa o 1 o 0?
E la formula qual è? Nella definizione hai scritto 3x-2/6, nel codice invece (3x-2)/6, che già usando 2 non da un numero intero...
A prescindere da tutto ciò, verifica uscirà sempre con false senza mai richiamarsi nemmeno una volta, perchè tu imponi xx = 0 e poi esci subito al primo if...
mistergks
10-03-2012, 10:31
ora ho messo definitivamente apposto la traccia e il codice...scusate ma ho postato con lo smartphone e mi sono perso qualcosa:confused:
Quindi credo che si debba fare cosi...se x è uguale a deve ritornare false, se x è uguale a 1 true e se x>1 deve passare nella formula (3x-2)/6 .
E credo debba convergere verso uno dei casi base...altrimenti non ho capito nemmeno io la traccia!:doh:
vendettaaaaa
10-03-2012, 11:29
ora ho messo definitivamente apposto la traccia e il codice...scusate ma ho postato con lo smartphone e mi sono perso qualcosa:confused:
Quindi credo che si debba fare cosi...se x è uguale a deve ritornare false, se x è uguale a 1 true e se x>1 deve passare nella formula (3x-2)/6 .
E credo debba convergere verso uno dei casi base...altrimenti non ho capito nemmeno io la traccia!:doh:
Sarà come dici tu con la formula (3x-2)/6. Ieri ho detto che usando x = 2 non si ottiene un numero intero ma in realtà essendo una divisione tra interi si otterrebbe 0.
Cmq basta che negli if tu metta il controllo solo su x e non su xx, il resto va bene.
mistergks
10-03-2012, 11:56
Sarà come dici tu con la formula (3x-2)/6. Ieri ho detto che usando x = 2 non si ottiene un numero intero ma in realtà essendo una divisione tra interi si otterrebbe 0.
Cmq basta che negli if tu metta il controllo solo su x e non su xx, il resto va bene.
Ad esempio mettendo x=5...facendola a mano dopo tutte le ricorsioni verrebbe 1 e quindi restituirebbe true...invece mi dà false! (sempre arrotondando per difetto e quindi usando gli int)..
Ho inizializzato x=3 e mi stampa OK... provando a mano..viene 1 al primo passo...quindi secondo me si ferma a un solo passo e non viene richiamata piu' volte la funzione... l'errore è questo ma non so come risolverlo
vendettaaaaa
10-03-2012, 12:18
5 è false:
1° chiamata 5 == 0? no, 5 == 1? no, allora xx = (15-2)/6 = 13/6 = 2; return verifica(2).
E sappiamo che 2 restituisce false.
vendettaaaaa
10-03-2012, 12:27
#include <iostream>
using namespace std;
bool verifica(int x);
int main()
{
for (int i = 0; i <= 100; ++i) {
cout << i << " does";
if (!verifica(i)) cout << " not";
cout << " belong to this weird recursive sequence" << endl;
}
cout << endl;
return 0;
}
bool verifica(int x)
{
if (x == 0) return false;
else if (x == 1) return true;
else {
int y = (3*x - 2)/6;
return verifica(y);
}
}
mistergks
10-03-2012, 12:30
5 è false:
1° chiamata 5 == 0? no, 5 == 1? no, allora xx = (15-2)/6 = 13/6 = 2; return verifica(2).
E sappiamo che 2 restituisce false.
opsss è vero!! non so manco fare i conti più :mc: ..
E allora qual'è un numero > 1 che restituisce true?! non riesco a trovarlo! :muro:
cenarius_88
10-03-2012, 22:25
Mi sbaglierò ma...
prova con x = 3.
3==0? no... procede
3==1? no... procede
(3*3-2)/6=(9-2)/6=7/6=1 (per arrotontamento all'intero più vicino)
procede con verifica(1)
1==0?no... procede
1==1?si... vero....stampa ok
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.