C++ 对这个递归示例有点困惑

C++ 对这个递归示例有点困惑,c++,recursion,C++,Recursion,gcd(5,15)的结果是什么 我最终得到了15,但我不确定它是否正确,所有的循环都让我困惑。以下是按顺序进行的递归调用 int gcd (int a, int b) { if (b == 0) return a; if (a == 0) return b; return gcd (b, a % b); } 因此gcd(5,15)的返回值是5 int gcd (int a, int b) { if (b == 0) return a;

gcd(5,15)的结果是什么


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

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

int gcd (int a, int b)
{
   if (b == 0)
      return a;
   if (a == 0)
      return b;
   return gcd (b, a % b);
}

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

int gcd (int a, int b)
{
   if (b == 0)
      return a;
   if (a == 0)
      return b;
   return gcd (b, a % b);
}
所以gcd(5,15)的返回值是5,假设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

设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

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

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

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

gcd(5, 15)
gcd(5, 5) # Because 5 % 15 = 5
gcd(5, 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
。所以你应该返回5

查看发生了什么的一个好方法是在函数的开头和两个显示发生了什么的最终返回点插入
printf
语句:

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; 
Python实现示例:

gcd(5,15)
gcd(15,5)
gcd(5,0)
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 (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; 
Python实现示例:

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

gcd(5,15)=5。gcd算法的一个例子是。逐步完成该算法。告诉我们为什么你认为是15。请注意,尽管参数以
(a,b)
的形式传入,但顺序变为
(b,a%b)
@aryamcarthy犯了一个愚蠢的错误,跳过了递归调用。如果
gcd
应该代表最大公分母,那么
gcd(5,15)
应该是5,而不是15。gcd(5,15)=5。gcd算法的一个例子是。逐步完成该算法。告诉我们为什么你认为是15。请注意,尽管参数以
(a,b)
的形式传入,但顺序变为
(b,a%b)
@aryamcarthy犯了一个愚蠢的错误,跳过了递归调用如果
gcd
应该代表最大公分母,那么
gcd(5,15)
应该是5,而不是15。