2011-01-12 15 views
6

Mam rekursję do rozwiązania.Jak skutecznie obliczyć relacje rekursji w matematyce?

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 

Jednakże, ten kod MMA bardzo nieefektywne

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

długo trwa do zniesienia obliczyć F [40,20]. Czy ktokolwiek mógłby zaproponować skuteczny sposób robienia tego? Wielkie dzięki!

+3

To nie jest "rozwiązywanie" rekursji. To, o co prosisz, to "implementacja funkcji dwóch zmiennych zdefiniowanych przez rekursję". Rozwiązanie rekursji wymagałoby znalezienia bezpośredniej formuły w kategoriach m i nie obejmujących rekursji. – ogerard

Odpowiedz

12

Standardowa sztuczka polega na zapisywaniu wartości pośrednich. Poniższe zajmuje 0,000025 sekund

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