这个递归示例有点困惑

时间:2017-05-04 06:40:00

标签: c++ recursion

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分,但我不确定它是否正确,所有循环都让我感到困惑。

4 个答案:

答案 0 :(得分:4)

以下是按顺序进行的递归调用

gcd(5, 15)
gcd(5, 5) # Because 5 % 15 = 5
gcd(5, 0)

因此gcd(5,15)的返回值为5

答案 1 :(得分:0)

设a = 5且b = 15;

在第一个循环中,我们检查a和b中的任何一个是否为0,它们不是,所以我们调用

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

所以a = 15,b = 5.

我们称之为gcd(5,15%5),即gcd(5,0)。

答案是5;

答案 2 :(得分:0)

以这种方式查看递归调用:

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; 

答案 3 :(得分:0)

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,返回printf。所以你应该回来5。

查看正在发生的事情的好方法是在函数的开头插入gcd(5,15) gcd(15,5) gcd(5,0) 5 语句,并在两个最终返回点处显示发生的情况:

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)

示例Python实现:

Layout.fillWidth: true