NOIP 提高组初赛 · NOIP 2012 提高组初赛试题 第 7 题

选择题 · 答案 A · 考点:递归函数

← 整套速查表 NOIP 提高组初赛 全部真题

题目

在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。

答案:A

考点

递归函数

解题思维

拿到这题先想:递归每次调用都要把返回地址和参数压栈,栈空间有限,层数多了自然就爆了,所以直接锁定‘栈’相关选项。

常见错误

很多学生会把‘栈’和‘堆’搞混,或者看到‘溢出’就条件反射选‘链表’‘队列’,其实递归只占用调用栈,和堆(动态分配区)、队列(FIFO 缓冲区)、链表(动态节点区)完全没关系,命题人就是爱拿这些容易混淆的内存区域来挖坑。

详细解析(节选)

递归调用错误

递归过深时:

答案:A

考点与概念

递归函数在运行时,系统会为每一层调用分配一块栈帧,用来保存局部变量、参数以及返回地址。这些栈帧是沿着调用栈(call stack)一层层压上去的。因为栈的大小是固定的,一旦递归层数超过了栈能容纳的帧数,就会发生栈溢出错误。这就是为什么递归代码如果缺少终止条件,或者终止条件难以达到,程序就会崩溃。

命题视角

这道题属于纯概念题,出题人想考察的是学生对递归运行时的内存行为是否清晰。递归是竞赛里的常客,但很多初学者只关注逻辑正确性,忽略了底层实现细节。命题人故意把‘栈’‘堆’‘队列’‘链表’四个选项并列,就是为了测试学生能否准确区分不同内存区域的作用:递归只涉及栈,堆用于动态内存分配,队列用于顺序存取,链表则是动态节点结构。这种‘挖坑’方式在初赛里很常见,尤其是选择题,往往靠排除法就能得分,但前提是概念要扎实。

思考心法

拿到题先想:递归每次调用都要把返回地址和参数压栈,栈空间有限,层数多了自然就爆了,所以直接锁定‘栈’相关选项。然后快速排除其他三个:堆是动态分配区,递归不会用到;队列是FIFO缓冲区,和递归无关;链表是动态节点区,同样不相关。这样三步走就能稳稳选对。

避坑提醒

最容易错的是把‘栈溢出’和‘堆溢出’混淆,或者看到‘溢出’就条件反射选‘链表’‘队列’。其实递归只占用调用栈,和堆、队列、链表完全没关系,命题人就是爱拿这些容易混淆的内存区域来挖坑。另外,有些同学会纠结‘为什么不是栈指针溢出’,其实栈指针溢出本质上就是栈空间耗尽,答案还是栈溢出。

考频与趋势

递归函数在题库中共考过 115 题,覆盖 8 个考试级别(2007-2026)。逐年分布:2007年4题、2008年4题、2009年2题、2010年2题、2012年2题、2013年3题、2014年1题、2019年2题、2020年1题、2021年5题、2022年2题、2023年7题、2024年25题、2025年15题、2026年18题、null年22题。分赛事:GESP 五级35题、CSP 入门级32题、GESP 六级12题、NOIP 提高组 初赛10题、CSP 提高级9题、NOIP 普及组 初赛8题、GESP 七级7题、GESP 八级2题。从数据看,递归是高频考点,尤其在近年(2024-2026)考频激增,说明命题人越来越喜欢挖底层运行细节。未来在初赛选择题中,仍大概率以‘递归导致什么错误’‘栈帧包含哪些内容’等概念题形式出现,也可能结合具体递归代码问栈空间消耗或栈溢出条件,难度不会太大,但概念混淆仍是主要失分点。暂无足够依据预测更细化的题型变化,但高频趋势已足够明确:概念要稳,别在‘栈’‘堆’上掉坑里。

同考点真题

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