如何解决给定算法的递归?

时间:2012-06-09 06:02:31

标签: algorithm recursion

int gcd(n,m)
{
  if (n%m ==0) return m;
  n = n%m;
  return gcd(m,n);
}

我解决了这个问题,我得到了

T(n, m) = 1 + T(m, n%m)  if n > m
        = 1 + T(m, n)    if n < m
        = m              if n%m == 0

我很困惑如何进一步获得最终结果。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:7)

这里的问题是m和n的下一个值的大小完全取决于先前的值,而不仅仅是它们的大小。 Knuth详细介绍了“计算机程序设计的艺术”第2卷:研究数学算法,第4.5.3节。大约五页之后,他证明了你可能已经猜到了,最糟糕的情况是m和n是连续的斐波纳契数。从这个(或其他方面!)可以看出,在最坏的情况下,所需的分割数量是两个参数中较大者的对数线性。

经过大量繁重的数学运算后,Knuth证明了平均情况在论证的对数中也是线性的。

答案 1 :(得分:2)

mcdowella给出了一个完美的答案。

对于直观的解释,你可以这样想,

如果n> = m,则n mod m < N / 2;

这可以显示为,

如果m&lt; n / 2,然后: n mod m&lt; m&lt; N / 2

如果m> n / 2,则:n mod m = n-m&lt; N / 2

如此有效地将较大的输入减半,并且在两次调用中,两个参数都将减半。