|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[c++] funzione ricorsiva definita come segue
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 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);
}
Ultima modifica di mistergks : 10-03-2012 alle 10:28. Motivo: errori nella traccia e nel codice |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Cioè come?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
C'è stato un errore di copia incolla..ora ho messo la definizione..
Inviato dal mio GT-I9003 usando Tapatalk |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
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... |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
ora ho messo definitivamente apposto la traccia e il codice...scusate ma ho postato con lo smartphone e mi sono perso qualcosa
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!
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
Cmq basta che negli if tu metta il controllo solo su x e non su xx, il resto va bene. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
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 Ultima modifica di mistergks : 10-03-2012 alle 12:21. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
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. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Codice:
#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);
}
}
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
E allora qual'è un numero > 1 che restituisce true?! non riesco a trovarlo! |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Nov 2007
Città: Alcamo
Messaggi: 103
|
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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:53.



















