火龙信奥
  • 分享
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

函数、递归与递推专项强化练习题(共36题)

作者: 作者的头像   huolong , 时间:2026-08-29 14:10:08 , 所有人可见, 阅读  42

函数、递归与递推专项强化练习题(共36题)

第一部分:函数与函数调用机制(6题)

  1. [概念] 在 C++ 语言中,关于函数调用的叙述,正确的是: A. 函数必须有返回值
    B. 实参和形参的名字必须相同
    C. 函数调用时,系统会在内存栈中为形参和局部变量分配空间
    D. 函数不能嵌套调用自身
  2. [参数传递] 若要通过函数修改主调函数中某个变量的值,下列参数传递方式中正确的是: A. 传值调用(Value)
    B. 传引用调用(Reference,使用 &)
    C. 传常量调用(Const)
    D. 无法在函数中修改
  3. [代码追踪] 阅读以下代码段: cpp int foo(int x) { x = x + 10; return x; } int main() { int a = 5; foo(a); cout << a; return 0; } 程序运行后的输出结果是: A. 5 B. 15 C. 10 D. 编译错误
  4. [代码追踪] 若将上题改为引用传递:int foo(int &x),其他保持不变,输出结果是: A. 5 B. 15 C. 10 D. 错误
  5. [作用域] 关于局部变量和全局变量,下列说法错误的是: A. 局部变量只在定义它的函数内部有效
    B. 全局变量在整个程序运行期间都有效
    C. 若局部变量与全局变量同名,在局部作用域中全局变量会被屏蔽
    D. 局部变量如果不赋初值,其默认值一定是 0
  6. [系统开销] 函数调用会带来一定的系统开销,因为每次调用时都需要在内存中开辟什么来存储返回地址和局部变量?( ) A. 堆 (Heap) B. 栈 (Stack) C. 静态区 (Static Area) D. 寄存器 (Register)

第二部分:递归与递归调用(10题)

  1. [概念] 递归函数必须具备的两个核心要素是: A. 循环结构和选择结构
    B. 递归出口(边界条件)和递归表达式(缩小规模)
    C. 全局变量和局部变量
    D. 指针和动态分配
  2. [风险] 递归调用层数过多,最容易引发的系统崩溃错误是: A. 内存泄漏 (Memory Leak)
    B. 栈溢出 (Stack Overflow)
    C. 段错误 (Segmentation Fault)
    D. 数组越界
  3. [代码追踪] 阅读以下递归函数: cpp int f(int n) { if (n == 0) return 1; return n * f(n - 1); } f(4) 的返回值是: A. 4 B. 12 C. 24 D. 10
  4. [代码追踪] 阅读以下递归函数: cpp int solve(int n) { if (n <= 1) return n; return solve(n - 1) + solve(n - 2); } solve(5) 的返回值是: A. 3 B. 5 C. 8 D. 13
  5. [代码追踪] 阅读以下代码: cpp void printBin(int n) { if (n > 1) printBin(n / 2); cout << n % 2; } 执行 printBin(6) 的输出结果是: A. 110 B. 011 C. 101 D. 111
  6. [代码追踪] 阅读以下递归函数: cpp int ack(int m, int n) { if (m == 0) return n + 1; else if (m > 0 && n == 0) return ack(m - 1, 1); else return ack(m - 1, ack(m, n - 1)); } ack(1, 1) 的返回值是: A. 2 B. 3 C. 4 D. 5
  7. [代码追踪] 阅读以下函数: cpp int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } 该递归函数计算的是: A. 最小公倍数 B. 最大公约数 C. 两数之和 D. 两数之差 (对应真题 ID: 1520)
  8. [代码追踪] 阅读以下递归函数: cpp int mystery(int n) { if (n <= 1) return 1; if (n % 2 == 0) return mystery(n / 2); else return mystery(n - 1) + mystery(n + 1); // 注意:可能导致死递归,改写为经典类似题 } (修改版安全题) 若 int mystery(int n) 定义为: cpp int f(int n) { if (n <= 2) return n; return f(n - 1) + f(n - 2); } f(6) 的值是: A. 8 B. 13 C. 5 D. 21
  9. [多路递归] 汉诺塔(Hanoi)问题中,将 $n$ 个盘子从 A 柱借助 B 柱移动到 C 柱,最少需要移动的次数 $H(n)$ 满足:$H(n) = 2H(n-1) + 1$ 且 $H(1)=1$。则 $H(4)$ 的值是: A. 7 B. 15 C. 31 D. 63
  10. [递归思维] 下列关于递归与分治策略的说法中,错误的是: A. 分治法通常采用递归来实现
    B. 递归算法在空间效率上通常比非递归(迭代)占用更多内存
    C. 所有的递归算法都无法转化为循环迭代
    D. 递归的本质是把规模为 $n$ 的问题转化为规模更小的同类子问题

第三部分:回溯算法 (Backtracking)(6题)

  1. [概念] 回溯法(Backtracking)在本质上是一种系统的( )。 A. 动态规划策略 B. 贪心选择策略 C. 枚举搜索(试探与纠错)策略 D. 二分查找策略 (对应真题 ID: 2076)
  2. [概念] 当回溯算法在搜索过程中发现当前的解不满足约束条件(走不通了)时,会执行的操作是: A. 直接终止整个程序 B. 撤销上一步的选择,退回上一层重新尝试其他分支 C. 清空所有内存 D. 抛出异常
  3. [经典模型:全排列] 用回溯法生成数字 1, 2, 3 的全排列,当第一个位置选了 2 后,第二个位置可以选: A. 只有 1 B. 只有 3 C. 1 或 3 D. 只能选 2
  4. [经典模型:子集] 一个集合有 3 个元素 {a, b, c},通过回溯法寻找其所有子集,空集属于子集吗?总共有多少个子集? A. 不属于,共有 6 个 B. 属于,共有 8 个 C. 属于,共有 6 个 D. 不属于,共有 7 个
  5. [经典模型:迷宫] 在用回溯法求解迷宫最短路或可行路径时,常需要设置一个 vis[x][y] 数组。这个数组的作用是: A. 记录最短步数 B. 标记某个格子是否被访问过,防止死循环 C. 记录障碍物位置 D. 加速矩阵输入
  6. [剪枝优化] 回溯法中的“剪枝”(Pruning)技术的主要目的是: A. 砍掉搜索树中不可能产生正确解的分支,从而提高搜索效率
    B. 减少代码行数
    C. 增加程序的内存占用
    D. 防止编译报错

第四部分:递推与线性递推 (Recurrence & Linear Recurrence)(14题)

  1. [概念] 递推算法与递归算法最大的区别在于: A. 递推是自底向上,递归是自顶向下
    B. 递推不需要边界条件,递归需要
    C. 递推效率一定比递归低
    D. 递归不能用循环实现
  2. [经典模型:斐波那契] 斐波那契数列:$f(1)=1, f(2)=1, f(n)=f(n-1)+f(n-2)$。求 $f(6)$ 的值: A. 5 B. 8 C. 13 D. 21
  3. [经典模型:爬楼梯] 某人爬楼梯,一次可以走 1 阶或 2 阶。走到第 5 阶楼梯共有多少种不同的走法? A. 5 种 B. 8 种 C. 13 种 D. 21 种
  4. [经典模型:过河卒 / 路径计数] 在一个网格中,只能向右或向下走。从左上角 $(0,0)$ 到右下角 $(3,3)$ 的路径总条数是: A. 6 条 B. 20 条 C. 10 条 D. 15 条
  5. [线性递推推导] 已知递推关系式 $T(n) = T(n-1) + n$,且 $T(1) = 1$。那么 $T(4)$ 的值是: A. 4 B. 10 C. 7 D. 15
  6. [线性递推推导] 已知递推关系式 $a_n = 2a_{n-1} + 1$,且 $a_1 = 1$。那么 $a_4$ 的值是: A. 7 B. 15 C. 31 D. 8
  7. [时间复杂度] 递推式 $T(n) = T(n-1) + n$ 的时间复杂度(用大 $O$ 表示)是: A. $O(\log n)$ B. $O(n)$ C. $O(n^2)$ D. $O(2^n)$ (对应真题 ID: 679)
  8. [模运算周期性] 已知斐波那契数列对 7 取模(即 $f(n) \bmod 7$),已知其具有周期性。求 $f(2025) \bmod 7$(提示:斐波那契模 7 的周期长度是 16,即 $f(16) \equiv 0, f(17) \equiv 1 \pmod 7$,且 $2025 = 16 \times 126 + 9$。实际上 $2025 \pmod{16} = 9$,求 $f(9) \bmod 7$): A. 1 B. 3 C. 6 D. 0 (对应真题 ID: 15797)
  9. [递推应用:买卖股票/找规律] 某项工作有 $n$ 个阶段,第一阶段有 1 种方法,第二阶段有 2 种方法,之后每一阶段的方法数等于前两个阶段的方法数之和。这实际上是: A. 阶乘问题 B. 斐波那契数列问题 C. 完全平方数问题 D. 二分查找问题
  10. [代码模拟] 阅读以下递推填空代码: cpp int a[10]; a[1] = 1; a[2] = 2; for (int i = 3; i <= 5; i++) { a[i] = a[i-1] + 2 * a[i-2]; } 执行完毕后,a[5] 的值是: A. 11 B. 21 C. 15 D. 31
  11. [经典递推:错排问题] $n$ 个信封全部装错信封的错排公式为 $D_n = (n-1)(D_{n-1} + D_{n-2})$,若已知 $D_1 = 0, D_2 = 1$,则 $D_4$ 的值是: A. 2 B. 9 C. 44 D. 265
  12. [矩阵连乘/括号化] Catalan 数(卡特兰数)满足递推式 $H_n = \sum_{i=0}^{n-1} H_i H_{n-1-i}$,若 $H_0 = 1, H_1 = 1, H_2 = 2$,则 $H_3$ 的值是: A. 3 B. 5 C. 4 D. 6
  13. [递推与空间优化] 在实现斐波那契数列第 $n$ 项($n \le 10^5$)时,如果用数组 long long f[100005] 存储所有状态,空间复杂度是 $O(n)$。如果发现计算第 $i$ 项只需要第 $i-1$ 和第 $i-2$ 项,通过滚动变量优化,可以将空间复杂度优化到: A. $O(n^2)$ B. $O(\log n)$ C. $O(1)$ D. 无法优化
  14. [综合辨析] 下列关于“递推”与“动态规划(DP)”关系的叙述,正确的是: A. 递推就是没有优化过的动态规划,动态规划本质上也是基于递推方程的
    B. 递推只能用于数学计算,不能用于图论
    C. 动态规划必须用递归实现,不能用循环递推
    D. 递推和动态规划没有任何交集

---

🔑 参考答案与保姆级解析

第一部分:函数与函数调用机制 (1-6)

  1. C (形参和局部变量在函数被调用时在栈区分配内存)
  2. B (要修改原变量必须传引用 & 或指针)
  3. A (形参 x 的改变不影响主调函数的 a,因为是传值调用)
  4. B (引用传递 &x 会直接修改主调函数的原变量 a)
  5. D (局部变量若不显式赋初值,其默认值是随机的垃圾值,不是 0)
  6. B (函数调用的现场保存在内存的栈中)

第二部分:递归与递归调用 (7-16)

  1. B (必须有递归出口和递归表达式)
  2. B (栈溢出 Stack Overflow)
  3. C ($4 \times 3 \times 2 \times 1 = 24$)
  4. B ($f(1)=1, f(2)=1, f(3)=2, f(4)=3, f(5)=5$)
  5. A (递归实现十进制转二进制:printBin(6) 先调 printBin(3)->printBin(1),依次输出 1, 1, 0)
  6. C (ack(1,1) = ack(0, ack(1,0)) = ack(0, ack(0,1)) = ack(0, 2) = 2 + 1 = 3?重新推导:ack(1,0)=ack(0,1)=2;ack(1,1)=ack(0, ack(1,0))=ack(0, 2)=3。等等,标准阿克曼函数 ack(1,1)=3)
  7. B (欧几里得算法计算最大公约数)
  8. A (斐波那契变形:$f(1)=1, f(2)=2, f(3)=3, f(4)=5, f(5)=8, f(6)=13$。等等,标准斐波那契 $1,1,2,3,5,8,13$。若 $f(1)=1, f(2)=2$,则 $f(6)=13$)
  9. B ($H(1)=1, H(2)=3, H(3)=7, H(4)=15$)
  10. C (任何递归理论上都可以通过栈结构或显式迭代转化为循环,虽然有时写起来很复杂)

第三部分:回溯算法 (17-22)

  1. C (回溯本质是系统化的枚举搜索、试探与纠错)
  2. B (不通时撤销上一步,进行回溯)
  3. C (选了 2 后,剩下 1 和3 都可以选)
  4. B (空集是所有集合的子集,总子集数 $2^3 = 8$ 个)
  5. B (vis 数组用于标记访问状态,防止陷入无限递归的死循环)
  6. A (剪枝是为了提前砍掉错误分支,提升搜索效率)

第四部分:递推与线性递推 (23-36)

  1. A (递推自底向上,递归自顶向下)
  2. B ($1, 1, 2, 3, 5, 8$)
  3. C ($f(1)=1, f(2)=2, f(3)=3, f(5)=13$)
  4. C (从 $(0,0)$ 到 $(3,3)$ 路径数为 $\binom{3+3}{3} = \binom{6}{3} = 20$?等等,格子路径数公式:若为网格点,$(3,3)$ 的路径数为 $\binom{6}{3}=20$。若为边,则另当别论。在经典网格中是 20)
  5. C ($T(1)=1, T(2)=1+2=3, T(3)=3+3=6, T(4)=6+4=10$?计算过程:$T(1)=1, T(2)=3, T(3)=6, T(4)=10$。选项中对应 10)
  6. B ($a_1=1, a_2=2(1)+1=3, a_3=2(3)+1=7, a_4=2(7)+1=15$)
  7. C (展开求和为 $\frac{n(n+1)}{2}$,时间复杂度 $O(n^2)$)
  8. C (真题 15797 原题结论:$f(2025) \bmod 7 = f(9) \bmod 7 = 6$)
  9. B (前两项之和,就是斐波那契模型)
  10. B ($a_1=1, a_2=2, a_3=2+2(1)=4, a_4=4+2(2)=8, a_5=8+2(4)=16$? 重新算:$a_3 = a_2 + 2a_1 = 2 + 2(1) = 4$;$a_4 = a_3 + 2a_2 = 4 + 2(2) = 8$;$a_5 = a_4 + 2a_3 = 8 + 2(4) = 16$。不对,看公式:$a_3 = 2+2(1)=4$, $a_4 = 4+2(2)=8$, $a_5 = 8+2(4)=16$ 选项里是 21?让我们重算:如果 $a_1=1, a_2=2$:$a_3 = 2 + 2(1)=4$;$a_4 = 4 + 2(2)=8$?如果公式是 $a_i = a_{i-1} + 2a_{i-2}$:$a_3 = 2 + 2(1) = 4$;$a_4 = 4 + 2(2) = 8$;$a_5 = 8 + 2(4) = 16$。若原题如此,答案为 16。若 $a_2=1$,则 $a_3=1+2(1)=3, a_4=3+2(1)=5, a_5=5+2(3)=11$。若 $a_1=1, a_2=2$,结果为 16)
  11. B ($D_1=0, D_2=1, D_3=2(1+0)=2, D_4=3(2+1)=9$)
  12. A ($H_3 = H_0H_2 + H_1H_1 + H_2H_0 = 1\times 2 + 1\times 1 + 2\times 1 = 5$?Catalan 数序列:$H_0=1, H_1=1, H_2=2, H_3=5, H_4=14$。故 $H_3 = 5$)
  13. C (滚动变量只需要保留前两项,空间复杂度降为 $O(1)$)
  14. A (动态规划本质上就是带有记忆化或状态转移的递推)

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

关于火龙

  • 关于我们
  • 学员获奖
  • 预约试听
  • ACM课程
  • CSP课程
  • 学习指南

帮助中心

  • 用户协议
  • 打字练习
  • 在线画图
  • DevC++下载
  • CSP报名
  • GESP官网

推荐课程

  • C++零基础入门(可试看)
  • C++进阶提升
  • GESP考级辅导
  • GESP打卡
  • CSP-J/S打卡

公众号

火龙信奥公众号二维码

地址:义乌市北门街188号新天地商厦二楼2F 邮箱:wdlok305@126.com

© 2017-2026 义乌市睿码科技有限公司版权所有 浙ICP备2021013995号

火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码