Cómo calcular las relaciones de recurrencia en Mathematica de manera eficiente?
-
10-10-2019 - |
Pregunta
Tengo una recursividad para resolver.
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]];]
Se necesita insoportablemente largo para f compute [40,20]. ¿Podría alguien por favor sugerir una forma eficaz de hacer esto? Muchas gracias!
Solución
truco estándar es salvar los valores intermedios. A continuación se lleva a 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]]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow