在这个递归示例上有些困惑

A little confused on this recursion example

本文关键字:递归      更新时间:2023-10-16
int gcd (int a, int b)
{
   if (b == 0)
      return a;
   if (a == 0)
      return b;
   return gcd (b, a % b);
}

GCD(5,15(的结果是什么?

我最终得到15,但我不确定是否正确,所有的循环都使我感到困惑。

以下是按顺序

进行的递归调用
gcd(5, 15)
gcd(5, 5) # Because 5 % 15 = 5
gcd(5, 0)

因此,GCD的返回值(5,15(为5

让A = 5和B = 15;

在第一个循环中,我们检查A和B中的任何一个是否为0,它们不是这样称呼

GCD(15,0(;因为5%15 = 5。

so a = 15,b = 5。

我们致电GCD(5,15%5(,即GCD(5,0(。

答案是5;

以这种方式参见递归调用:

gcd(5, 15)
        |
    gcd(15,  5 (as 5 % 15)  )   // 'b' simply takes position of 'a'
               | 
           gcd(5,  0 (as 15 % 5) )
                     |
                if (b == 0) return a; // a is 5, so returned value is 5.
           return 5;
    return 5; 
return 5; 

gcd (5, 15)返回 gcd (15, 5 % 15) == gcd (15, 5),然后返回 gcd (5, 5 % 15) == gcd (5, 5),返回 gcd (5, 5 % 5) == gcd (5, 0) == 5。所以你应该返回5。

查看发生的事情的一种好方法是在功能开始时和两个最终返回点插入printf语句,以显示发生的情况:

gcd(5,15)
gcd(15,5)
gcd(5,0)
5

一个示例Python实现:

def gcd (a, b):
    print("gcd({0},{1})".format(a, b))
    if b == 0:
        print(a)
        return a
    if a == 0:
        print(b)
        return b
    return gcd (b, a % b)
gcd(5,15)