对如下代码实现的欧几里得算法(辗转相除法),执行 gcd(48, 18) 得到的调用序列为( )。 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
A:gcd(48,18) -> gcd(18,12) -> gcd(12,6) -> gcd(6,0)
B:gcd(48,18) -> gcd(30,18) -> gcd(12,18)
C:gcd(48,18) -> gcd(18,30) -> gcd(30,6)
D:gcd(48,18) -> gcd(12,18) -> gcd(6,12)
正确答案:A
答案解析
分析函数调用过程时,观察递归条件:当b不为0时,递归调用gcd(b, a % b)。每次调用将第二个参数更新为当前两数的模运算结果,第一个参数更新为原第二个参数。递归持续直到第二个参数变为0,此时返回第一个参数。跟踪该过程中每一对传入参数的变化序列,可得连续的参数对演化路径。
试卷来源:202603 CCF-GESP编程能力等级认证C++五级真题