gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:00:25 24 4
gpt4 key购买 nike

我只能找到关于如何递归和迭代地实现 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com