2011-01-12 12 views
6

Ich habe eine Rekursion zu lösen.Wie berechnet man Rekursionsbeziehungen in Mathematica effizient?

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 

jedoch der folgende mma-Code ist sehr ineffizient

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]];] 

Es unerträglich lange dauert f [40,20] zu berechnen. Könnte jemand bitte einen effizienten Weg vorschlagen, dies zu tun? Danke vielmals!

+3

Dies ist nicht "lösen" eine Rekursion. Was Sie fordern, ist "eine Funktion von zwei durch Rekursion definierten Variablen zu implementieren". Um eine Rekursion zu lösen, müsste man eine direkte Formel für m und n ohne Rekursion finden. – ogerard

Antwort

12

Standardtrick ist das Speichern von Zwischenwerten. Folgendes dauert 0,000025 Sekunden

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]]