2011-01-12 12 views
6

Tengo una recursión por resolver.¿Cómo calcular las relaciones de recursión en mathematica de manera eficiente?

f(m,n)=Sum[f[m - 1, n - 1 - i] + f[m - 3, n - 5 - i], {i, 2, n - 2*m + 2}] + f[m - 1, n - 3] + f[m - 3, n - 7] 
f(0,n)=1, f(1,n)=n 

Sin embargo, el siguiente código de MMA es muy ineficiente

f[m_, n_] := Module[{}, 
    If[m < 0, Return[0];]; 
    If[m == 0, Return[1];]; 
    If[m == 1, Return[n];]; 
    Return[Sum[f[m - 1, n - 1 - i] + f[m - 3, n - 5 - i], {i, 2, n - 2*m + 2}] + f[m - 1, n - 3] + f[m - 3, n - 7]];] 

Toma insoportablemente largo para calcular f [40,20]. ¿Podría alguien sugerir una forma eficiente de hacer esto? ¡Muchas gracias!

+3

Esto no está "resolviendo" una recursión. Lo que está pidiendo es "implementar una función de dos variables definidas por recursión". Para resolver una recursión sería necesario encontrar una fórmula directa en términos de myn que no implique recursión. – ogerard

Respuesta

12

El truco estándar es guardar los valores intermedios. Lo siguiente toma 0.000025 segundos

f[m_, n_] := 0 /; m < 0; 
f[0, n_] := 1; 
f[1, n_] := n; 
f[m_, n_] := (f[m, n] = 
    Sum[f[m - 1, n - 1 - i] + f[m - 3, n - 5 - i], {i, 2, 
     n - 2*m + 2}] + f[m - 1, n - 3] + f[m - 3, n - 7]); 
AbsoluteTiming[f[40, 20]] 
Cuestiones relacionadas