Hallo,
mein Programm funktioniert sehr gut aber nur solange ich
kleine m und n angebe. Wenn ich große Zahlen für m und n
wähle, rechnet es ein paar Tage. Kann mir jemand helfen, um
diese Rekursion effizienter zu machen??? Ich wollte die Daten
in eine Tabelle schreiben aber das hat irgendwie nicht
geklappt. Danke für jeden Hinweis.
Ich habe Dein Programm erstmal so umgestellt,
dass die Werte für m und n je nur einmal
berechnet werden. Das sollte schon einiges
bringen (m=50,n=50 in weniger als 1 sec).
Ob das korrekt ist, kann ich nicht beurteilen,
da ich den verwendeten Algorithmus nicht kenne
(irgendwas wie Reihenentwicklung in einem
physikalischen Kontext).
Auf jeden Fall liefert es die selben Ergebnisse
wie Dein Code. Wenn Du höhere m,n brauchst,
musst Du
#define TBSIZE 100
entsprechend erhöhen (immer etwas höher als Deine Zahlen).
Was meinst Du denn mit „in eine Tabelle schreiben“?
Grüße
CMБ
#include **#define TBSIZE 100**
**#define EMPTY (4-5)**
**float zeta\_0\_tb[TBSIZE][TBSIZE];**
**float zeta\_1\_tb[TBSIZE][TBSIZE];**
**void init\_zeta\_tb() {**
**int i, j;**
**for(i=0; ifor(j=0; jzeta\_0\_tb[i][j] = zeta\_1\_tb[i][j] = EMPTY;
}
float zeta\_0(int m, int n)
{
float delta = 6;
float epsilon = 1;
if( m==0 || n==0 ) return 0;
if( zeta\_0\_tb[m][n] != EMPTY ) return zeta\_0\_tb[m][n];
return zeta\_0\_tb[m][n] =
1 + (
( delta \* n \* zeta\_0(m, n-1)
+ epsilon \* m \* n \* zeta\_0(m-1, n+1)
)
/ (delta\*n + epsilon\*m\*n)
);
}
float zeta\_1(int m, int n)
{
float M = 6;
float rho = 6;
if( m==0 || n==0 ) return 0;
if( zeta\_1\_tb[m][n] != EMPTY ) return zeta\_1\_tb[m][n];
return zeta\_1\_tb[m][n] = (
(M/rho)
+ M \* n
+ m \* n
+ M \* zeta\_0(m+1, n )
+ M \* n \* zeta\_1(m, n-1)
+ m \* n \* zeta\_1(m-1, n+1)
- M \* zeta\_0(m, n )
)
/ (M\*n + m\*n);
}
main()
{
int m, n;
m = 20;
n = 20;
init\_zeta\_tb();
printf("%f\n", zeta\_0(m,n) );
printf("%f\n", zeta\_1(m,n) );
return 0;
}**