GESP五级冲锋:看透递归,破解真题的思维密钥
各位备战2026年3月GESP C++五级的同学们,我是老马。近期我分析了多期GESP五级真题,发现“递归”是命题人非常青睐的核心考点。它不只考查代码阅读,更考查对计算过程本质的理解。今天,我们就以几道经典真题为靶心,深挖递归的解题思路与技巧,助你备考时有的放矢。
真题回顾与考点直击
我们先看两道来自2024年9月和6月的真题:
有如下函数fun,则fun(20, 12)的返回值为( )。【GESP五级:2024.09】
intfun(inta, intb)
{
if(a % b == 0)
returnb;
else
returnfun(b, a % b);
}
A. 20
B. 12
C. 4
D. 2
“
真题2(递归与迭代比较)
对下面两个函数,说法错误的是?( )【GESP五级:2024.09】
intsumA(intn)
{
intres = 0;
for(inti = 1; i <= n; i++)
{
res += i;
}
returnres;
}
intsumB(intn)
{
if(n == 1)
return1;
intres = n + sumB(n - 1);
returnres;
}
A. sumA体现了迭代的思想。
B. SumB采用的是递归方式。
C. SumB函数比SumA的时间效率更高。
D. 两个函数的实现的功能相同。
“题目给出迭代求和sumA与递归求和sumB两个函数,问说法错误的选项。
C选项称“SumB函数比SumA的时间效率更高”。这显然是错误的。对于同一O(n)复杂度的求和,递归函数因涉及多次函数调用(压栈、跳转、返回),其时间开销与空间开销通常均大于简单的迭代循环。答案为C。
核心考点:理解递归与迭代在效率、实现思想上的区别。
真题3与4(递归执行过程分析)
给定如下函数:
intfun(intn)
{
if(n == 1) return1;
if(n == 2) return2;
returnfun(n - 2) - fun(n - 1);
}
则当 时,函数返回值为( )。【GESP五级:2024.06】
A. 0
B. 1
C. 21
D. -11
“这是递归的更深层考查。题3问fun(7)的值。这需要你根据递归定义手动递推:
f(1)=1, f(2)=2 (基准情形)
f(3)=f(1)-f(2)=1-2=-1
f(4)=f(2)-f(3)=2-(-1)=3
f(5)=f(3)-f(4)=-1-3=-4
f(6)=f(4)-f(5)=3-(-4)=7
f(7)=f(5)-f(6)=-4-7=-11 答案为D。
给定如下函数(函数功能同上题,增加输出打印):
intfun(intn)
{
cout<< n << " ";
if(n == 1) return1;
if(n == 2) return2;
returnfun(n - 2) - fun(n - 1);
}
则当 时,屏幕上输出序列为( )。【GESP五级:2024.06】
A. 4 3 2 1
B. 1 2 3 4
C. 4 2 3 1 2
D. 4 2 3 2 1
“递归解题核心思路与技巧题4在此基础上增加输出语句cout << n << " ";,问fun(4)的输出序列。这进一步考查对递归调用顺序的精确理解。调用过程如下:
调用fun(4),输出“4”。
计算fun(4)需先调用fun(2)(输出“2”并返回2),再调用fun(3)。
调用fun(3),输出“3”。
计算fun(3)需先调用fun(1)(输出“1”并返回1),再调用fun(2)(输出“2”并返回2)。 因此,输出序列为4 2 3 1 2,答案为C。
核心考点:掌握递归定义的数列求值,并能清晰刻画递归函数的调用栈与执行顺序。
通过以上真题,我们可以总结出应对递归类题目的系统性方法:
1. 明确递归三要素
基准情形:即递归的终止条件。如真题1中的a % b == 0,真题3中的n==1或n==2。
递归推进:函数如何调用自身,向基准情形演进。如fun(b, a%b), fun(n-2) - fun(n-1)。
递归设计:确保每次调用都向基准情形靠近,避免无限递归。
3. 掌握两种分析工具
递推计算:对于求具体值(如真题3),像解数学数列一样,从基准情形出发,逐步推导目标值。建议在草稿纸上列出计算过程。
调用树分析:对于涉及执行顺序或多次调用的题目(如真题4),画出递归调用树是最高效的方法。每个节点代表一次函数调用,标上参数和输出,按顺序遍历,结果一目了然。
4. 理解递归与迭代的辩证关系
递归:思维直接,代码简洁,符合对某些问题的自然描述,但调用开销大。
迭代:通常效率更高,但某些问题的迭代逻辑可能不如递归直观。
转化:理论上,所有递归都可以转化为迭代,反之亦然。GESP常考查对此概念的理解。
夯实基础:确保对递归定义、执行过程等基础概念理解透彻。
动手演练:对于递归函数,不要只停留在“看”,要动手画调用树、写递推步骤。
真题为本:将历年真题中的递归题目集中归类练习,总结命题规律和常见考查形式。
关注混合考查:递归常与算法、数据结构、输出顺序等结合考查,需提升综合应用能力。
递归是编程思想的重要分水岭。吃透它,不仅能轻松应对GESP考试,更能为你后续的算法学习打下坚实基础。希望这篇文章能帮你拨开迷雾,看清递归的本质。
预祝各位在2026年3月的考试中取得优异成绩!
青少年编程竞赛交流