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

选择题 · 答案 B · 考点:递推

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

题目

印度古老的汉诺塔传说:创世时有三根金刚柱,其中一柱从下往上按照大小顺序摞着 64 片黄金圆盘,当圆盘逐一片从一柱借助另外一柱全部移动到另外一柱时,宇宙毁灭。移动规则:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。下面的 C++ 代码以递归方式实现汉诺塔,横线处应填入代码是( )。

#include <iostream>
using namespace std;
// 递归实现汉诺塔,将N个圆盘从A通过B移动C
// 圆盘从底到顶,半径必须从大到小
void Hanoi(string A, string B, string C, int N) {
    if (N == 1) {
        cout << A << " -> " << C << endl;
    } else {
        Hanoi(A, C, B, N - 1);
        cout << A << " -> " << C << endl;
        ________; // 此处填写代码
    }
}
int main() {
    Hanoi("甲", "乙", "丙", 3);
    return 0;
}
答案:B

考点

递推

解题思维

这道题考递归分治思想,拿到题先想汉诺塔三步走:移n-1个到辅助柱、最大盘到目标柱、再把n-1个从辅助柱移到目标柱,代码已写完前两步,横线处只需补第三步,看参数顺序就能锁定答案。

常见错误

填空时最容易把盘子数写错成N-2,或者把源柱、辅助柱、目标柱的角色搞混,比如把B当源、A当目标,那样最后一步就变成把盘子从B移到A,完全违背规则。另外也有同学只背结论不推导,看到选项D里C当源柱就下意识觉得‘C是目标柱,怎么当源?’直接排除,其实D的参数顺序是C->B->A,正好把盘子从C移回B,逻辑上是通的,只是不符合本题需求。

详细解析(节选)

这道题考查递归与分治策略,具体就是汉诺塔问题的经典递归解法。汉诺塔的核心思想是:要把N个盘子从源柱A移到目标柱C,且只能借助辅助柱B,必须分三步走——第一步,把上面N-1个盘子从A移到B(此时C作为辅助);第二步,把最底下的那个大盘子直接从A移到C;第三步,再把B上那N-1个盘子从B移到C(此时A作为辅助)。题目给的代码已经实现了前两步,横线处必须补第三步。第三步的关键是:源柱是B,辅助柱是A,目标柱是C,盘子数量仍然是N-1。所以调用Hanoi的参数顺序必须是B、A、C、N-1,对应选项B。命题人故意把参数顺序打乱,就是想考你对递归过程中‘柱子角色动态切换’的理解,而不是死记硬背代码。思考心法:拿到这类题,先别急着看选项,自己在纸上画个树状图,写出递归分解的三步,然后对照代码已实现的部分,缺哪一步就填什么。避坑提醒:很多同学会误以为第三步盘子数是N-2,其实不然,因为第一步已经把N-1个盘子移走了,第二步只动了最大的一个,第三步还是要搬回N-1个,所以数量还是N-1;另外选项A的盘子数写成了N-2,明显错误;选项C把A当源柱,但此时A上只剩最大盘,无法再搬N-2个;选项D把C当源柱,C是目标柱,逻辑上也不成立。考频与趋势:递归函数在题库中已考过115题,覆盖8个考试级别,其中GESP五级就考了35题,占比很高,且近年考频持续上升(2024年25题、2025年15题、2026年18题),说明这是高频考点,命题人特别喜欢用汉诺塔这类经典模型来考察学生对递归参数顺序和分治步骤的掌握。未来预测:基于现有数据,递归类题目在GESP五级及后续初级竞赛中仍会保持高频率出现,且命题形式可能从单纯填空转向更复杂的递归调试或递归优化(如记忆化),但核心逻辑不变——先分解步骤,再匹配参数。因此,复习时应重点练习汉诺塔、斐波那契、阶乘等经典递归模型,不仅要会写,更要能口述每一步的源、辅、目角色变化,这样才能应对各种变式。

同考点真题

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