使用Matrix属性快速计算Fibonacci的快速方法
Divide_Conquer_Fib(n) {
i = h = 1;
j = k = 0;
while (n > 0) {
if (n%2 == 1) { // if n is odd
t = j*h;
j = i*h + j*k + t;
i = i*k + t;
}
t = h*h;
h = 2*k*h + t;
k = k*k + t;
n = (int) n/2;
}
return j;
}
我如何理解这段代码?你的策略是什么?您是否会放置大量的打印语句来查看变量状态如何变化? 重要的是要了解各种开发人员的想法如何理解这段代码。
答案 0 :(得分:0)
我会首先针对n的几个值运行它来检查它实际上是否给出了正确的答案。然后,我会阅读数学理论,了解它是如何工作的,最后利用这些知识把它带到位......
Matrix form上的维基百科条目部分解释了此算法的基础。
答案 1 :(得分:0)
嗯,查看这段代码的正确方法是知道它的作用:Fibonacci数字经常出现一个有趣的练习,加上有很多背景说明它的作用:它一起使用矩阵属性分而治之。事实证明,您可以计算向量(Fib n ,Fib n-1 )作为某些矩阵和的乘积( Fib n-1 ,Fib n-2 )。让我们假设下面代码中的两行只是同一矩阵的两行:
(Fib[n] ) (1 1) (Fib[n-1])
( ) = ( ) * ( )
(Fib[n-1]) (1 0) (Fib[n-2])
现在,二次矩阵的矩阵乘法是关联的,即,如果上面的矩阵是 M ,你可以将 Fib n 计算为 M n 次(1,0)。
下一步是使用分而治之计算 M n 。这里的基本技巧是 M n 可以根据 n 的位进行分解:而不是通过 n <来计算功率< / em>乘法将计算分解为计算平方,如果值为奇数,则将一个额外项乘以。
这是基本的基本方法。功率的计算是在另一个方向完成的,然而,它可以工作 - 我认为 - 因为矩阵是对称的。如果您不了解基本方法,我认为您无法轻松地从代码中推导出算法。