c - GCD 函数的递归运行时间(欧几里德算法)

标签 c runtime time-complexity recurrence greatest-common-divisor

我只能找到关于如何递归和迭代地实现 gcd 函数的帖子,但是我找不到这个。我确定它在 Stackoverflow 上,但是我找不到它,所以如果它是重复的帖子,我深表歉意。

我查看了维基百科( here )上的分析,无法理解它们的递归关系。

考虑以下在 C 中递归实现的 GCD 函数的实现。它有一个前提条件,即两个数字都必须是正数,但与运行时间无关。

int gcd( int const a, int const b ) {
  // Checks pre conditions.
  assert( a >= 0 );
  assert( b >= 0 );

  if ( a < b ) return gcd( b, a );

  if ( b == 0 ) return a;

  return gcd( b, a % b );
}

对运行时进行分析,我发现每个操作都是 O(1),因此我们知道到目前为止的递推关系是:T(n) = O(1) + ???。现在分析递归调用,我不确定如何将 a (mod b) 解释为我的递归调用以正确说明我的递归关系。

最佳答案

在每个递归步骤中,gcd 会将其中一个参数(最多)减半。要看到这一点,请看以下两种情况:

如果 b >= a/2 那么在下一步你将有 a' = bb' < a/2 因为 % 操作将从 b 中删除 a 或更多。

如果 b < a/2 那么在下一步你将有 a' = bb' < a/2 因为 % 操作最多可以返回 b - 1

因此,在每个递归步骤中,gcd 会将其中一个参数减半(最多)。这是 O(log(N)) 步,其中 N 是初始 ab 的最大值。

关于c - GCD 函数的递归运行时间(欧几里德算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137019/

相关文章:

c - 检测 C 中整数的溢出

php - PHP 中运行时动态绑定(bind)变量

java - 避免循环内使用 toCharArray() 或 arrayCopy 产生冗余

python - 从列表/队列中删除一些项目的快速方法

c - Linux 操作系统 - 来自父进程、子进程、父进程的输入输出管道

c - 结构数组的空闲内存

c - 为什么使用此代码创建的文本文件具有字符集 == 二进制?

excel - VBA Excel 文件系统对象

java - Spring 在运行时针对特定时间安排任务

algorithm - 寻找图是否具有唯一拓扑顺序的时间复杂度