PDA

Visualizza la versione completa : [C++] Funziona che ritorna valori diversi per parametri uguali Oo


Ippo343
01-07-2009, 18:48
Stavo provando a fare uno degli esercizi del sito UVa (http://uva.onlinejudge.org/index.php?option=com_frontpage&Itemid=1), per la precisione il numero 100 (http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=36).

Dato un algoritmo chiede di calcolare il massimo numero di iterazioni necessario a terminarlo per i valori compresi tra due numeri i e j forniti nell'input.

Io ho scritto questo:



int algLen(int n)
{
int result;

while (n != 1)
{
if (n%2)
{
n = 3 * n + 1;
}
else
{
n = n / 2;
}

result++;
}

result++;
return result;
}


Che pare funzionare senza problemi, o almeno da dei risultati plausibili.
Dato che gli intervalli forniti sono più di uno in realtà, ho pensato di scrivere questa funzione che restituisce direttamente il massimo valore di algLen nell'intervallo passato come parametro.



int maxAlgLen(int i, int j)
{
int lenK, maxLen = 0;

for (int k = i; k <= j; k++)
{
lenK = algLen(k);

if (lenK > maxLen)
maxLen = lenK;
}

return maxLen;
}


Consideriamo l'intervallo 1 10. Tra 1 e 10 il massimo valore di algLen è 20. Questo lo so perchè glieli faccio stampare tutti a video. E questo è giusto, per (1;10) viene 20 anche secondo il sito.

La cosa divertente è che se eseguo:



int main()
{
cout << maxAlgLen(1, 10);
}


ottengo invariabilmente 77. Il che di per sè non è tanto fastidioso, se consideriamo che questo codice:



int main()
{
for (int i = 1; i < 11; i++)
cout << algLen(i) << endl;

cout << endl;
cout << maxAlgLen(1, 10);
cout << endl;

return 0;
}


stampa ogni volta un valore diverso, che è sempre nei dintorni di circa 32600.
:confused:

Cioè posso capire che ci sia un errore e mi dia il risultato sbagliato, ok... MA COME DIAVOLO FA A RESTITUIRE VALORI DIVERSI OGNI VOLTA PER GLI STESSI PARAMETRI!?!? :dhò:

Stoicenko
01-07-2009, 19:03
un motivo può essere che la variabile result non è inizializzata.. inizializzala a 0 e vedrai che funziona

Ippo343
01-07-2009, 19:08
Vero, grazie.

Ora toglimi una curiosità. Com'è che la funzione in cui si usava la variabile non inizializzata dava sempre il risultato corretto mentre quella che si appoggiava solo al suo valore ne era influenzata? E' assurdo xD

MacApp
01-07-2009, 22:32
Originariamente inviato da Ippo343
Ora toglimi una curiosità. Com'è che la funzione in cui si usava la variabile non inizializzata dava sempre il risultato corretto mentre quella che si appoggiava solo al suo valore ne era influenzata? E' assurdo xD
Tra i comportamenti indefiniti ci sono anche quelli assurdi ;-)

Loading