Dynamic programming is a technique for avoiding the repeated computation of the same values in a recursive program. Each value computed is immediately stored. If the value is needed again, it is not computed but simply looked up in the table. a2020_0

我在工作中經常使用orthogonal polynomials。由於* Mathematica *僅支持the classical ones，因此我經常不得不編寫自己的函數。例如，單項Charlier多項式滿足三項遞歸

$$ C_ {n + 1} ^ {（a）}（x）=（xan）C_n ^ {（a）}（x）-C_ {n-1} ^ {（a）}（x）$$

$ C_0 ^ {（a）}（x）= 1 $和$ C_1 ^ {{a）}（x）= x-a $。

如果我想能夠在* Mathematica *中使用Monic Charlier多項式，我可以這樣做：

```
CharlierC[0, a_, x_] := 1;
CharlierC[1, a_, x_] := x - a;
CharlierC[n_Integer, a_, x_] := (x - a - n + 1) CharlierC[n - 1, a, x] -
a (n - 1) CharlierC[n - 2, a, x]
```

這條路線的問題當然是，用於生成例如`CharlierC[20, a, x]`

的精力不能用於評估`CharlierC[50, a, x]`

。對於單參數遞歸函數（例如Fibonacci），動態編程既精巧又精巧，可以節省評估工作。對於多參數函數，想像一下如果使用定義`CharlierC[n_Integer, a_, x_] := CharlierC[n, a, x] = (* stuff *)`

然後執行`Plot[{CharlierC[5, 1, x], CharlierC[6, x, 2]}, {x, -1, 1}]`

會發生什麼。

是否有一種方法可以利用多參數函數的動態編程優勢，同時僅存儲遞歸變量（在Charlier示例中為`n`

）更改的結果？