C语言——汉诺塔之递归

汉诺塔是什么?简单明了,就是有3根柱子:A, B, C。   A柱上有若干个圆盘,将其上面的圆盘移到C柱上,且必须遵循的一个原则 上小下大就是小盘子得在大盘子上面。B柱可以作为中转站。

 描述:

            ( 1 )  如果只有1个盘子的话,A柱上的盘子移到C柱,则A -> C。

         

          ( 2 ) 如果有2个盘子的话,需 A -> B,  A -> C, B -> C。 

 

分析:

        当A柱上有N个盘子的时候,先将A塔上共n-1个的盘子移动到B柱上(借助C柱),然后将A柱上最大的n号盘子移动到C柱上,最后将B柱上的n-1个盘子借助A柱移动到C柱上。

        当 N == 1 时

第一次: A -> C

       共移动:1次。

        当N == 2时

第一次:A -> B

第二次:A -> C

第三次:B -> C

        共移动:3次。

        当N == 3时

第一次:A ->C

第二次:A->B

第三次:C->B

第四次:A->C

第五次:B->A

第六次:B->C

第七次:A->C

        共移动:7次

由此得出一个结论 :移动的次数为   2^n  -  1 。

根据上述分析,实现代码:

#include<stdio.h>

void move(char pos1, char pos2)
{

	printf("%c->%c\n", pos1, pos2);
}


int hanoi(int n, char pos1,char pos2,char pos3)
{
	
	if (n == 1)
    {
		move(pos1, pos3);
	}
    else
	{
        //需要将 pos1的 n-1 个盘子通过中转位置pos3 移到pos2;
		hanoi(n - 1, pos1, pos3, pos2);  

		move(pos1, pos3);

         最后将pos2的 n-1 个盘子通过中转位置pos1 移到目的为止 pos3
		hanoi(n - 1, pos2, pos1, pos3);	 
	}
}


int main()
{
	int n = 0;

	scanf("%d", &n);	//代表盘子的个数

	hanoi(n, 'A', 'B', 'C');	
	
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值