“花里胡哨”的汉诺塔问题-----C语言,递归函数,颜色改变,全局变量,静态变量

汉诺塔问题:
有3根棒分别为a,b,c。 a棒上叠放n个大小不等的盘子,依次叠放为大盘在下,小盘在上。要求把这n个盘移动到c棒上,在移动过程中可以借助b棒,每次只能移动一个盘,并且在移动过程中必须始终保持3根棒上的大盘在下,小盘在上。编写程序,并且打印出移动盘子的步骤。
图:在这里插入图片描述
看似很难,实则并不简单;
把A当作源柱子,B当作辅助柱子,C当作目标柱子;
但是,我们可以从简单的开始分析;
n=1时;
只需要A–>C一步完成;
当n>1时,我们先看最大的圆盘,如果这个最大的圆盘要从A移到C,那么前提是它上面没有任何圆盘,这样一来,其他圆盘就一定在B上;那么如何实现B上出现其余的n-1个圆盘呢?其实就是将n-1个圆盘从A移动到B,而这个问题,正好和我们正在编写的函数要解决的问题是同一个问题,所以直接递归调用,至此我们实现了逻辑闭环。
这之后,我们就能开始写代码了;
函数参数:

  • int n: 需要移动的盘子数量。
  • char a: 起始柱子。
  • char b: 辅助柱子。
  • char c: 目标柱子。

递归逻辑:

  1. 基本情况 (if (n == 1)):

    • 如果只有一个盘子,直接将它从起始柱子 a 移动到目标柱子 c。调用 move(a, c)
  2. 递归情况 (else):

    • 如果有多个盘子,需要分三步完成:
      1. 先将 n-1 个盘子从起始柱子 a 移动到辅助柱子 b,使用目标柱子 c 作为辅助。调用 hanoit(n - 1, a, c, b)
      2. 将剩下的一个盘子从起始柱子 a 移动到目标柱子 c。调用 move(a, c)
      3. 再将 n-1 个盘子从辅助柱子 b 移动到目标柱子 c,使用起始柱子 a 作为辅助。调用 hanoit(n - 1, b, a, c)
#include<stdio.h>
//定义函数,打印,使步骤具象化,例如A-->B
void move(char from,char to)
{
   
   
    printf("%c-->%c\n",from,to);

}
//关键的汉诺塔函数,使用递归
void hanoit(int n,char a,char b,char c)//n表示盘子的个数,a,b,c分别表示三根柱子的代号
{
   
   
    if(n==1) move(a,c);//最后一步,即上面讨论的 n = 1 的情况
    else {
   
   
        hanoit(n-1,a,c,b);//先移动 n-1 个圆盘,但是不移动到目标柱,所以我们要从源柱子 a 移动到辅助柱子 b,使用目标柱子 c 作为辅助。
        move(a,c);//具象化
        hanoit(n-1,b,a,c);//然后将 n-1 个圆盘从辅助柱子 b 移动到目标柱子 c,使用源柱子 a 作为辅助。
    }
}
//主函数
int main()
{
   
   
    int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值