CSP-J 入门级 · CSP 2021 入门级第一轮 第 13 题

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

← 整套速查表 CSP-J 入门级 全部真题

题目

考虑如下递归算法

solve(n)  
     if n<=1 return 1  
      else if n>=5 return n*solve(n-2)  
      else return n*solve(n-1)  

则调用 solve(7) 得到的返回结果为( )。

答案:C

考点

递归函数

解题思维

这题考递归函数,拿到题先别急着算,盯着条件分支看:n≤1 直接回 1,n≥5 跳两格,中间那几格回一格。顺着 7 往下拆,到底层再往回乘,别把哪一步的 n 看错就行。

常见错误

最容易栽跟头的就是条件判断顺序,很多人看到 n≥5 就以为所有大数都减 2,忘了 n=2,3,4 时要减 1;还有回溯时容易把底层的 1 漏乘,或者把某一步的 n 当成前一步的 n 直接乘,导致算出 105 或 840 这种明显偏大偏小的数。

详细解析(节选)

这道题考查的核心是递归函数的执行流程与条件分支的优先级判断。命题人最喜欢在递归的中间层设坑,让你以为一直走“减 2”的快通道,结果在 n=2,3,4 这些临界值上突然拐了个弯,变成“减 1”,这就完全改变了递归树的形状和最终数值。要解这类题,心法就是:先画骨架,再填肉,最后算数。骨架就是搞清楚每一步到底走了哪个分支,肉就是把这些分支串起来,算数就是老老实实按回溯乘法来。很多学生一上来就手算,结果在 solve(3) 这里就晕了,以为 3 也满足 n≥5 的条件,或者忘了 solve(2) 其实要减 1,最后算出来跟正确答案差了一大截。所以,拿到这种递归题,千万别急着动笔算,先像过电影一样,把从 n 到 1 的每一层调用路径在脑子里过一遍,确认每一步的 n 到底落在哪个 if 里,这一步做对了,后面就算数也稳了。题目给的代码其实很典型,三个分支覆盖了所有整数 n:n≤1 是终止条件,直接回 1;n≥5 是加速通道,直接回 n*solve(n-2);剩下的 n=2,3,4 就是减速通道,回 n*solve(n-1)。这个设计让递归树在 n≥5 时呈指数级收缩,而在 n 较小时呈线性收缩,正是出题人挖坑的高发区。现在我们来一步步拆解 solve(7) 的执行过程,严格按照代码逻辑走,一层一层往下推,再一层一层往上回乘,这样既能保证思路清晰,也能避免跳步导致的错误。第一步,n=7,满足 n≥5,所以走 else if 分支,返回 7*solve(5)。第二步,n=5,同样满足 n≥5,继续走 else if 分支,返回 5*solve(3)。第三步,n=3,此时 n 不再满足 n≥5,也不满足 n≤1,只能走最后的 else 分支,返回 3*solve(2)。第四步,n=2,同样不满足前两个条件,走 else 分支,返回 2*solve(1)。第五步,n=1,满足 n≤1,直接返回 1。到这里,递归已经到底了,开始回溯计算。从最底层往上:solve(2) = 2 * solve(1) = 2 * 1 = 2;solve(3) = 3 * solve(2) = 3 * 2 = 6;solve(5) = 5 * solve(3) = 5 * 6 = 30;最后 solve(7) = 7 * solve(5) = 7 * 30 = 210。所以答案是 C 选项 210。这里特别要提醒的是,很多人会在 solve(3) 这一步出错,以为 3 也满足 n≥5,直接算成 3*solve(1),或者在 solve(2) 这一步忘了减 1,直接算成 2*solve(0) 导致死循环或错误结果,这些都是典型的条件判断优先级混淆。另外,回溯时的乘法顺序也不能乱,必须严格按照递归返回的顺序,从最内层开始往外乘,否则数值会完全不对。关于这个考点的考频和趋势,从题库统计来看,递归函数总共考过 115 题,覆盖 8 个考试级别,逐年分布显示 2024 年考得最多(25 题),2025 年也有 15 题,2026 年预计 18 题,说明递归题在近年尤其是 CSP 入门级和 GESP 五级六级中出现的频率非常高,命题人似乎特别喜欢用这种带条件分支的递归来考察学生的逻辑严密性。分赛事来看,GESP 五级考了 35 题,CSP 入门级考了 32 题,NOIP 提高组初赛考了 10 题,这些数据都指向一个趋势:递归不仅是基础考点,更是区分度很高的题型,尤其是在入门级和 GESP 中,几乎年年都有。基于这个趋势,未来这类题目可能会继续以“条件分支陷阱”的形式出现,比如把 n≥5 改成 n≥6,或者把 n≤1 改成 n≤0,甚至增加一个 n=0 的特殊处理,来进一步考察学生对边界条件的敏感度。当然,如果题目数据不足以支撑更具体的预测,我们也不能硬编,只能基于现有数据说“暂无足够依据预测”。但就这道题而言,数据已经足够清晰:递归函数的条件分支优先级是核心考点,n=2,3,4 时的减 1 是高频陷阱,回溯乘法顺序是必考细节。所以,下次再遇到类似的递归题,一定要先画递归树,确认每一层的 n 到底落在哪个分支,再从底层往上回乘,这样就能稳稳避开所有坑,拿到正确答案。

同考点真题

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