GESP 五级 · GESP 202312 C++ 五级 第 6 题

选择题 · 答案 A · 考点:函数与递归、算法、最大公约数与最小公倍数

← 整套速查表 GESP 五级 全部真题

题目

有关下面 C++ 代码说法正确的是( )。

int rc;
int foo(int x, int y)
{
    int r;
    if(y == 0)
        r = x;
    else{
        r = foo(y, x % y);
        rc++;
    }
    return r;
}
答案:A

考点

函数与递归算法最大公约数与最小公倍数

解题思维

这题考的是递归深度与输入规模的关系,别被'无限递归'吓住,关键看参数y每次怎么变,以及rc到底在统计什么。

常见错误

很多考生看到递归就慌,以为可能死循环,其实辗转相除法的精髓就是余数严格变小,必然终止。还有人把rc当成统计所有递归调用次数,忽略了rc只在else分支累加,也就是只统计'进入了下一层递归'的那次,最后一次返回时不会自增。求GCD和最小公倍数时也容易混淆,直接选D的不在少数。

详细解析(节选)

这道题考查的是递归函数的执行过程、参数变化规律以及递归次数的统计,本质上是欧几里得算法(辗转相除法)求最大公约数的实现。命题人挖坑的地方很典型:一是利用学生看到递归就联想到'死循环'的直觉,二是利用rc++的位置隐蔽地改变计数逻辑,三是混淆GCD与最小公倍数的概念。拿到题,先别急着看选项,得把代码跑一遍脑子里。foo函数里,如果y等于0就返回x,这是递归的终止条件;否则递归调用foo(y, x%y),同时让全局变量rc加1。注意看,rc++写在else块里,意味着只有当函数真正进入递归调用(即y!=0)时,rc才会增加。最后一次调用时y一定不为0(否则早就返回了),但这次调用结束后函数直接return,不会再执行rc++。所以rc统计的是'成功进入下一层递归'的次数,也就是递归深度减1。欧几里得算法的复杂度是O(log min(x,y)),递归深度就是log级别,不会无限。当x小于10时,递归深度最多也就6层左右(比如x=9, y=1时),rc自然远小于20,A选项正确。B选项说可能无限递归,错,因为x%y严格小于y,参数y单调递减,必终止。C选项说求最大公共质因子,错,求的是最大公约数,比如12和18的GCD是6,不是质数。D选项说求最小公倍数,错,返回的是GCD,最小公倍数需要结合公式(x*y)/gcd计算。关于考频,递归函数在题库里共考过115题,覆盖8个级别,其中GESP五级考了35题,占比很高,说明这是五级重点。最大公约数与最小公倍数共考32题,GESP五级占了20题,两者结合考查的概率很大。函数与递归共考67题,GESP五级19题。从趋势看,2024年递归相关题目猛增到25题,2025年15题,2026年18题,说明这类题在近期考试中非常活跃。预测未来,GESP五级仍会继续高频考查递归深度、参数变化规律以及全局变量在递归中的计数逻辑,可能会出类似'统计递归调用次数'或'判断递归是否终止'的变式题。暂无足够依据预测具体年份的题型细节,但考点组合(递归+数论)的稳定性很高。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断