题目要求:
有三个圆柱A、B、C,初始时A上有N个圆盘,N由用户输入给出,最终移动到圆柱C上。
每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP是步骤序号,宽度为4个字符,右对齐。
请编写代码,获得输入N后,输出汉诺塔移动的步骤。
输入格式
N
输出格式
移动步骤
样例输入
3
样例输出
[STEP 1] A->C
[STEP 2] A->B
[STEP 3] C->B
[STEP 4] A->C
[STEP 5] B->A
[STEP 6] B->C
[STEP 7] A->C
代码:
#include <iostream>
using namespace std;
void hanrot(int n, char A, char B, char C,int &i); //声明汉诺塔函数
void process(int n); 声明过程函数
int main() //主函数
{
int n; //用于输入圆盘数量
cin >> n;
process(n); //调用 过程函数
}
void hanrot(int n, char A, char B, char C, int& i) //汉诺塔函数的定义
{
//基准 递归终止的条件
if (n == 1)
{
printf("[STEP %d] %c->%c\n", i, A, C);
i++;
}
//递归调用
else
{
hanrot(n - 1, A, C, B, i);
printf("[STEP %d] %c->%c\n", i, A, C);
i++;
hanrot(n - 1, B, A, C, i);
}
}
void process(int n) //用于给汉诺塔函数传参数
{
int i = 1;
char a = 'A', b = 'B', c = 'C';
hanrot(n, a, b, c, i);
}
如何编写递归函数:
我在这里举例两个例子:
例一:阶乘问题的递归
当n=1时,f(n) = 1,其他情况f(n) = f(n-1) * n。对应的代码如下:
例二:斐波那契数列
当n <= 2时,结果是1,否则,f(n) = f(n-1) + f(n-2)。对应代码如下:
第一步:确定问题
就是递归函数的参数:
阶乘问题是求n的阶乘 , 斐波那契问题是求第n个数,汉诺塔问题是将n个与那盘从A通过B移动到C
第二步:解决基准问题
就是参数符合什么条件时,可以直接计算结果并返回:
阶乘问题当n = 1时,答案是1。斐波那契问题当n <= 2时,答案是1。汉诺塔问题当n = 1时,直接从A移动到C
第三步:确定问题如何拆解
寻找通过规模更小的子问题来解决当前问题
就是将参数变得更接近基准问题:
阶乘问题可以拆解成 n-1,斐波那契问题可以拆解还曾 n-1 和 n-1,汉诺塔问题拆解成 n-1个圆盘从A移动到B在移动到C和从B移动到C。
思路来源:
b站主播:NotOnlySuccess 其UID为:3546647317448859
超级厉害的一个up主,感兴趣的可以去看他的视频