经典递归(汉诺塔问题)

	在汉诺塔问题中,一股脑地考虑每一步如何移动很困难,我们可以换个思路。先假设除最下面的盘子之外,我们已经成功地将上面的63个盘子移到了b柱,此时只要将最下面的盘子由a移动到c即可。
	当最大的盘子由a移到c后,b上是余下的63个盘子,a为空。因此现在的目标就变成了将这63个盘子由b移到c。这个问题和原来的问题完全一样,只是由a柱换为了b柱,规模由64变为了63。因此可以采用相同的方法,先将上面的62个盘子由b移到a,再将最下面的盘子移到c……对照下面的过程,试着是否能找到规律:

将b柱子作为辅助,把a上的63个圆盘移动到b上
将a上最后一个圆盘移动到c
将a作为辅助,把b上的62个圆盘移动到a上
将b上的最后一个圆盘移动到c

也许你已经发现规律了,即每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程。

这个过程称为递归,即定义一组基本操作,这组操作将规模小一点(或大一点)的操作当做一个整体——无需关心它的细节,只当它已经完成了——然后执行剩下的操作。而在更小或更大的规模中也依此操作,直到规模达到预定值。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int i = 1;//记录步数
void Move2 (int n, char a, char c)//将编号为n的盘子由a移动到c
{
	 printf("%d步:将第%d个盘子由%c--->%c\n", i++, n, a, c);
}
void Move1 (int n, char a, char b, char c)//将n个盘子由初始塔a移动到目标塔c
{
 	if (n == 1)
	 	{
  			Move2(1, a, c);//只有一个盘子是直接从a移动到c
 		}
	 else
 		{
  			Move1(n - 1, a, c, b);//将初始塔a前的n-1个盘子借助目的塔c移动到借用塔b上
  			Move2(n, a, c);//将剩下的一个盘子移动到目的地塔c上
			Move1(n - 1, b, a, c);//最后将借用塔b上n-1个盘子移动到目的塔上
		 }
}
int main()
{
	 printf("请输入盘子的个数");
	 int n;
 	scanf("%d", &n);
 	char x = 'A', y = 'B', z = 'C';
 	printf("盘子移动情况如下:\n");
 	Move1(n, x, y, z);
 	system("pause");
 	return 0;
}

运行结果如下
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值