递归函数的有效方法

时间:2017-02-21 20:36:53

标签: algorithm recursion time-complexity

我已经提供了三个递归函数fun1(int )fun2(int )fun3(int)。所有这三个功能都相互依赖,即

fun1(m) = a * fun2(m-1) - b * fun3(m-1)
fun2(m) = c * fun1(m-1) - d * fun3(m-1)
fun3(m) = e * fun1(m-1) + f * fun2(m-1) 

我必须找到任何这些功能的价值。如何有效地做到这一点(在时间复杂度和非递归方法方面)?

2 个答案:

答案 0 :(得分:4)

您可以将三个方程表示为矩阵乘法:

[f1(m)] = [0 a -b] [f1(m-1)]
[f2(m)] = [c 0 -d] [f2(m-1)]
[f3(m)] = [e f  0] [f3(m-1)]

然后:

[f1(m)] = [0 a -b]^m [f1(0)]
[f2(m)] = [c 0 -d]   [f2(0)]
[f3(m)] = [e f  0]   [f3(0)]

假设您知道f1(0),f2(0),f3(0)的值,您可以计算O(log m)中f1(m),f2(m)和f3(m)的值)通过平方乘法计算矩阵幂来进行算术运算。

答案 1 :(得分:-1)

如果你的系数a,b,c,d,e,f不依赖于m,而是绝对常数(或者甚至是不依赖于m的变量中的任意多项式),那么你描述的重复被称为'线性”。这种情况完全由Petkovšek's algorithm解决。

该算法基本上可以让人计算所谓的重现的封闭形式。这里将详细介绍:https://www.math.upenn.edu/~wilf/AeqB.html