如何在mathematica中解析地解决递归关系?

时间:2011-01-12 03:40:07

标签: wolfram-mathematica

例如,我有以下递归,我想获得f [3,n]:

f[m_, n_] := Module[{}, If[m < 0, Return[0];];
  If[m == 0, Return[1];];
  If[2*m - 1 >= n, Return[0];];
  If[2*m == n, Return[2];];
  If[m == 1, Return[n];];
  Return[f[m, n - 1] + f[m - 1, n - 2]];]
f[3, n]

代码似乎不起作用。请帮忙。非常感谢!

1 个答案:

答案 0 :(得分:3)

您有一个无限递归,因为当m未初始化时,没有任何边界情况匹配。

如果您使用函数式编程,而不是使用Return,您将获得更可预测的行为,即

f[m_, n_] := Which[
  m < 0, 0,
  2 m - 1 >= n, 0,
  2 m == n, 2,
  m == 1, n,
  True, f[m, n - 1] + f[m - 1, n - 2]
  ]

在这种情况下,Which无法确定n未初始化时要选择哪个选项,因此f[3, n]将返回表达式。

获得公式的一种方法是使用RSolve。看起来它不能完全一般地解决这个等式,但你可以尝试使用这样的东西修复一个变量

Block[{m = 3},
 RSolve[f[m, n] == f[m, n - 1] + f[m - 1, n - 2], f[m, n], {n}]
 ]

在结果中,您将看到K[1]是一个任意迭代变量,C[1]是一个自由常量。它在那里因为没有指定边界情况