【问题标题】:Strategy to understand code I can't get理解我无法理解的代码的策略
【发布时间】:2013-11-22 21:30:23
【问题描述】:

快速计算斐波那契的快速方法,使用 Matrix 属性

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;

}

我如何理解这段代码?你的策略是什么?你会放很多打印语句来查看变量的状态如何变化吗? 了解不同开发人员的想法如何理解这段代码很重要。

【问题讨论】:

  • 我会看到它对 1,2,3,2n,2n+1 的表现,因为该算法适用于偶数和奇数。我会用纸和笔代替 printf
  • 我会拿一张纸,用我的铅笔“运行函数”来做一个非常简单的案例
  • 这个问题似乎是题外话,因为它是在征求程序员的意见,并指出“重要的是看看不同开发人员的想法是如何理解这段代码的”,这非常离题这个网站的主题。
  • 还是很有趣的:)
  • @ScottMermelstein,我想看看开发人员的流程——他的想法

标签: c++ debugging fibonacci


【解决方案1】:

我会首先针对 n 的几个值运行它,以检查它实际上是否给出了正确的答案。然后我阅读了数学理论以了解它可能是如何工作的,最后利用这些知识将其分解……

Matrix form 上的维基百科条目部分解释了此算法的基础。

【讨论】:

    【解决方案2】:

    好吧,查看这段代码的正确方法是了解它的作用:斐波那契数经常作为一个有趣的练习出现,而且有相当多的上下文说明它的作用:它一起使用矩阵属性分而治之。事实证明,您可以将向量 (Fibn, Fibn-1) 计算为某个矩阵和 ( Fibn-1,Fibn-2)。假设下面代码中的两行只是同一个矩阵的两行:

    (Fib[n]  )    (1  1)   (Fib[n-1])
    (        )  = (    ) * (        )
    (Fib[n-1])    (1  0)   (Fib[n-2])
    

    现在,二次矩阵的矩阵乘法是关联的,即如果上面的矩阵是 M 你可以计算 FibnMn(1, 0).

    下一步是使用分治法计算 Mn。这里的基本技巧是 Mn 可以根据 n 的位进行分解:而不是通过 n 乘法,您将计算分解为计算平方,如果值为奇数,则乘以一个额外的项。

    这是基本的底层方法。然而,幂的计算是在另一个方向上完成的——我认为——因为矩阵是对称的。如果您不了解基本方法,我认为您无法轻松地从代码中推导出算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多