学习递归-汉诺塔

  在b站上看比特大博哥的讲解再加上自己调试着捋了一下,感觉还是自己把代码写下来调试更能看懂也更有体会。

  感觉就是类似于数列递推的关系式,先确定三个柱子,以及起始、中转、目的位置。把问题分步处理。把所有盘一个一个按照从上到下从小到大的方式挪到目标柱子上=把最下面的(第n个)盘挪到目标柱子上,把其余剩下的n-1个盘挪到中转位置(设置递归)-目的位置。

A、B、C三个柱子在递归的,把问题分步处理过程中都可以成为起始、中转、目的位置。找那个

  话不多说我们来看看代码:

1.move函数,打印从起始-目标位置

void move (char pos1,char pos3)
{
    printf("%c->%c",pos1,pos3);
}

2.hanoi函数实现递归(核心代码)

void hanoi(int n,char pos1,char pos2,char pos3)//pos1为起始位置,pos2为中转位置,pos3为目的位置
/*每次调用函数时时A、B、C对应的是固定位置的参数。
在之后的自身调用中改变pos1,pos2,pos3参数的位置则参数名会对应和之前不同的ABC*/
//假设n=3
{
    if(n!=1)
    {
        hanoi(n-1,pos1,pos3,pos2);
/*n=2时pos1-A,pos3-B,pos2-C进入hanoi(n=2参数按1,2,3的位置对应传入ACB)所以
  n=1时pos1-A,pos3-C,pos2-B*/
        move(pos1,pos3);//从起始转移到目的位置
        hanoi(n-1,pos2,pos1,pos3);
    }
    else
    {
        move(pos1,pos3);//对于最上面一层盘,目的位对应B
    }

3.主函数功能实现:

#include <stdio.h>
int main()
{
	int b; 
	scanf("%d",&b);
	hanoi(b,'A','B','C');
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值