理解我无法获得的代码的策略

时间:2013-11-22 21:30:24

标签: c++ debugging fibonacci

使用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;

}

我如何理解这段代码?你的策略是什么?您是否会放置大量的打印语句来查看变量状态如何变化? 重要的是要了解各种开发人员的想法如何理解这段代码。

2 个答案:

答案 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>乘法将计算分解为计算平方,如果值为奇数,则将一个额外项乘以。

这是基本的基本方法。功率的计算是在另一个方向完成的,然而,它可以工作 - 我认为 - 因为矩阵是对称的。如果您不了解基本方法,我认为您无法轻松地从代码中推导出算法。