例如,我有以下递归,我想获得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]
代码似乎不起作用。请帮忙。非常感谢!
答案 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]
是一个自由常量。它在那里因为没有指定边界情况