如何有效地计算mathematica中的递归关系?

Posted

技术标签:

【中文标题】如何有效地计算mathematica中的递归关系?【英文标题】:How to compute recursion relations in mathematica efficiently? 【发布时间】:2011-06-07 13:59:28 【问题描述】:

我有一个递归要解决。

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

但是,下面的 mma 代码效率很低

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

计算 f[40,20] 需要很长时间。有人可以建议一种有效的方法吗?非常感谢!

【问题讨论】:

这不是“解决”递归。您要求的是“实现由递归定义的两个变量的函数”。解决递归需要找到一个不涉及递归的 m 和 n 的直接公式。 【参考方案1】:

标准技巧是保存中间值。以下需要 0.000025 秒

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

【讨论】:

以上是关于如何有效地计算mathematica中的递归关系?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mathematica 中的稀疏数组上有效替代 Outer?

如何有效地维护传递闭包表?

Mathematica 和 MATLABMaple 并称为三大数学软件

如何在 Linux 终端中有效地搜索文件

如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?

如何有效地分析相互递归函数