小白关于汉诺塔问题的递归理解

##汉诺塔问题的简述

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。(源自百度百科)

这个游戏其实就是将盘子来回的移动,最终实现盘子从 A——C的完美转变。

##汉诺塔问题的分析

假设我们现在有3个盘子,从小到大放在A这个杆上面,要移动到C杆上面,而且每次只能够移动一个盘子,我们要如何实现这一过程呢?
这里我简单的画了个草图(画工不咋地),我们可以看到要实现这一个过程,一共要7步才能够完成,而在这7步当中我们能够很明显的看到要想把A杆中最大的那一个盘子移到C杆中去,我们需要将2个上面的盘子移到B中去。
在这里,就实现了第一次的递归,再剩下的2个盘子通过A移至C去。
可以看到如果一共有n个盘子,我们可以通过这样的办法移至C去

              1.  n-1——>B
              2. A盘中最大的——>C
              3. n-1——>C

这实际就是递归的思想,如果(n>2)大家想想在第3步的时候是不是就回到了第1步,来回的不停在1-3步之间来回穿梭。

##代码的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int count = 0;
int hanoi(int n, char x, char y, char z)
{
	if (n == 1)
	{
		printf("将%d个从%c-->%c 第%d次\n",n, x, z,++count);   //这里的从x——>z是确定了每次的方向不变,后面只需要改变杆子之间的顺序就可以了
	}
	else
	{
		hanoi(n - 1, x, z, y);  //这里改变了z 和 y 的顺序,是为了能够将 n-1个盘子移至B中
		printf("将%d个从%c-->%c 第%d次\n",n,x,z,++count);  //这里直接将A杆中剩下的那个最大的传到C中
		hanoi(n - 1, y, x, z);  //这里再进行一次杆子顺序的改变是为了能够将B杆中剩下的 n-1 个移到C中去
    }
}




int main()
{
	int n = 0;
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	return 0;
}

以上就是我对于汉诺塔问题的理解,如果有不对的地方,欢迎各位大佬指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值