|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2010
Messaggi: 161
|
Algoritmo da ricorsivo a iterativo
Salve a tutti,
non ricordo/non riesco a trasformare un semplicissimo algoritmo da ricorsivo a iterativo. L'algoritmo è il seguente Codice:
double s(int i, int N, int A{
if (i == 0 ) return 0;
if (i == 1 ) return 1;
else return 2*N*s(i-1,N,A) + (A-N*N)*s(i-2,N,A);}
E come lo si traduce questo? Grazie e scusate la nabbanza |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Di solito con la risorsione in coda è una stupidaggine tradurlo in iterativo! Ma per quanto riguarda il tuo algoritmo hai a che fare con due chiamate ricorsive quindi non è proprio banale la cosa!
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Nel caso pero' si puo' semplificare il tutto mantenendo traccia di quanto valeva la funzione nei passi necessari precedenti.
Ovvero, durante la conta da 1 a i basta memorizzare il valore che la funzione aveva al passo precedente, e quello che aveva al passo precedente ancora.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Codice:
double s(int i, int N, int A)
{
// Il vettore S conterrà i valori del numero che vuoi calcolare
// inizialmente S[0] = 0 e S[1] = 1.
// Dopo di che usi gli ultimi due valori per calcolare il prossimo
// in maniera iterativa, sovrascrivendo di volta in volta il più
// vecchio, così da mantenere a ogni iterazione gli ultimi 2 valori
// che ti serviranno a calcolare il prossimo numero
double S[2] = { 0.0f, 1.0f }; // s(0, N, A) = 0, s(1, N, A) = 1
int j; // j è il prossimo numero che devi calcolare
for (j = 2; j <= i; j++)
{
// k è l'indice in cui si trova il valore s(j-2, N, A), quindi il più
// vecchio cioè quello che sostituirai. Ovviamente l'altro valore
// che ti serve si trova in S[1 - k]
int k = j % 2;
S[k] = 2*N*S[1 - k] + (A - N*N)*S[k];
}
// Uscito dal ciclo, il valore che cerchi è in 0 se i è pari, in 1 altrimenti
return S[i % 2];
}
ps: DOVREBBE funzionare
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
A me la complicazione dell'array con 2 elementi soli e del riferimento se il ciclo e' pari o dispari pare un eccesso poco leggibile.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
per quello c'è più commento che codice
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Propongo una cosa simile (ne' compilato ne' tantomeno testato) Codice:
double s(int i, int N, int A)
{
if (i == 0 ) return 0;
if (i == 1 ) return 1;
int TM2 = 0;
int TM1 = 1;
int TM0;
for (int q=2; q<=i; q++)
{
TM0 = 2*N*TM1 + (A - N*N)*TM2;
TM2 = TM1;
TM1 = TM0;
}
return TM0;
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: May 2010
Messaggi: 161
|
testiamolo
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: May 2010
Messaggi: 161
|
funzionare funziona
Mi spieghi come ci sei arrivato? |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ho scritto la logica nel primo post.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 16462
|
Quote:
caso base : s(0) =0, s(1)=1 caso ricorsivo : s(n) = 2Ns(i-1)+(A-N^2)s(i-2) quindi si vede che s(n) dipende soltanto dai due valori immediatamente precedenti s(i-1) e s(i-2). Nell'algoritmo iterativo sara' sufficiente ricordarsi degli ultimi due valori calcolati per determinare il valore piu' recente.
__________________
MICROSOFT : Violating your privacy is our priority |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:47.




















