gcd()函数中的递归调用数

gcd()函数中的递归调用数,c,algorithm,recursion,C,Algorithm,Recursion,最近我得到了一个gcd函数,用C编程语言编写,它接受两个参数n和m,并使用递归计算这两个数字的gcd。有人问我,如果n>=m,函数会进行多少次递归调用?有谁能为我的问题提供解决方案,因为我无法解决它。 以下是该函数的源代码: int gcd(int n, int m) { if (n%m==0) return m; else n=n%m; return gcd(m, n); } 给出步骤= Ta,b=1+Tb,r0=2+Tr0,r1=…=N+TrN-2,rN-1=N

最近我得到了一个gcd函数,用C编程语言编写,它接受两个参数n和m,并使用递归计算这两个数字的gcd。有人问我,如果n>=m,函数会进行多少次递归调用?有谁能为我的问题提供解决方案,因为我无法解决它。 以下是该函数的源代码:

int gcd(int n, int m)
{
  if (n%m==0)
    return m;
  else
    n=n%m;
  return gcd(m, n);
}
给出步骤=

Ta,b=1+Tb,r0=2+Tr0,r1=…=N+TrN-2,rN-1=N+1

其中a和b为输入,r_i为余数。我们使用了这个Tx,0=0

在论文中运行一个示例将帮助您更好地掌握上述等式:

gcd1071,462根据等效gcd462,1071 mod 462=gcd462,147计算得出。后一个GCD根据gcd147,462 mod 147=gcd147,21计算,后者又根据gcd21,147 mod 21=gcd21,0=21计算

所以a=1071和b=462,我们有:

T(a, b) = 
1 + T(b, a % b)       = 1 + T(b, r_0)   =    (1)
2 + T(r_0, b % r_0)   = 2 + T(r_0, r_1) =
3 + T(r_1, r_0 % r_1) = 3 + T(r_1, r_2) =    (2)
3 + T(r_1, 0)                           =
3 + 0                                   =
3
也就是说,我们需要采取3个步骤来计算GCD1071462

(1): notice that the 1 is the step already done before, i.e. T(a, b)
(2): r_2 is equal to 0 in this example
你可以在纸上运行过多的例子,看看这是如何展开的,如果你还没有看到,最终你将能够看到模式

注意:@Ian'Abott的评论也是正确的,我决定介绍这种方法,因为它更通用,可以应用于任何类似的递归方法。

给出了步骤=

Ta,b=1+Tb,r0=2+Tr0,r1=…=N+TrN-2,rN-1=N+1

其中a和b为输入,r_i为余数。我们使用了这个Tx,0=0

在论文中运行一个示例将帮助您更好地掌握上述等式:

gcd1071,462根据等效gcd462,1071 mod 462=gcd462,147计算得出。后一个GCD根据gcd147,462 mod 147=gcd147,21计算,后者又根据gcd21,147 mod 21=gcd21,0=21计算

所以a=1071和b=462,我们有:

T(a, b) = 
1 + T(b, a % b)       = 1 + T(b, r_0)   =    (1)
2 + T(r_0, b % r_0)   = 2 + T(r_0, r_1) =
3 + T(r_1, r_0 % r_1) = 3 + T(r_1, r_2) =    (2)
3 + T(r_1, 0)                           =
3 + 0                                   =
3
也就是说,我们需要采取3个步骤来计算GCD1071462

(1): notice that the 1 is the step already done before, i.e. T(a, b)
(2): r_2 is equal to 0 in this example
你可以在纸上运行过多的例子,看看这是如何展开的,如果你还没有看到,最终你将能够看到模式


注意:@Ian'Abott的评论也是正确的,但我决定介绍这种方法,因为它更通用,并且可以应用于任何类似的递归方法。

您是否尝试过在纸上单步浏览它,看看是否可以找到一种模式?。这将有助于您理解。@Thomas Jager我已经做了,但找不到任何有用的模式。我认为当n>=m时,递归调用(包括原始调用)的数量上限由1+logm/logphi给出,其中phi是黄金比率phi=sqrt5+1/2。包括原始调用在内的下限为1。当从gcd2,1开始倒序计算出连续的斐波那契数列是最坏的情况时,这很容易。我们还知道,斐波那契序列中连续数之间的比率沿着序列越接近φ,因此该序列以φ为基数近似为指数。logm/logphi根据m的基本phi计算log。1是为gcd的初始调用添加的。您是否尝试在纸上单步查看它以查看是否可以找到模式?。这将有助于您理解。@Thomas Jager我已经做了,但找不到任何有用的模式。我认为当n>=m时,递归调用(包括原始调用)的数量上限由1+logm/logphi给出,其中phi是黄金比率phi=sqrt5+1/2。包括原始调用在内的下限为1。当从gcd2,1开始倒序计算出连续的斐波那契数列是最坏的情况时,这很容易。我们还知道,斐波那契序列中连续数之间的比率沿着序列越接近φ,因此该序列以φ为基数近似为指数。logm/logphi根据m的基本phi计算log。为gcd的初始调用添加1。