递归 汉诺塔 C语言

# include <stdio.h>

/*
递归:
	条件:
		1. 有正确(明确)的终止条件
		2. 该函数处理的数据规模必须递减
		3. 这个转化必须是可解的

	特点:
		易于理解
		速度慢
		存储空间大

	1.汉诺塔(3个柱子,A, B, C,所有的盘子在A上,将A上的所有的盘子借助B 移动到C 上)
		伪代码:
			如果是一个盘子
				直接将A柱子上的盘子从A 移动到 C
			否则
				先将 A 上的n-1 个盘子借助 C 移动到 B 上
				将 A 上的盘子从 A 移动到 C
				最后将 B上的n-1 个盘子借助 A 移动到 C上

*/

//汉诺塔 (3个柱子,A, B, C,所有的盘子在A上,将A上的所有的盘子借助B 移动到C 上)
/*伪代码:
			如果是一个盘子
				直接将A柱子上的盘子从A 移动到 C
			否则
				先将 A 上的n-1 个盘子借助 C 移动到 B 上
				将 A 上的盘子从 A 移动到 C
				最后将 B上的n-1 个盘子借助 A 移动到 C上*/

void hannuota(int n ,char c1, char c2, char c3) { //3个柱子,A(c1), B(c2), C(c3),所有的盘子在A上,将A上的所有的盘子借助B 移动到C 上
												  //第一个参数代表需要移动的盘子的总个数,第二个参数代表原始盘子位置,第三个参数代表辅助位置,
												  //第四个参数代表目标位置
	if(n ==1 ) { //情况1

		printf("将编号为%d的盘子,从%c 移动到 % c\n",n, c1, c3);
	}else { //情况2

		hannuota(n - 1 ,c1, c3, c2); // 先将 A 上的n-1 个盘子借助 C 移动到 B 上
		printf("将编号为%d的盘子,从%c 移动到 % c\n",n, c1, c3); //将 A 上的盘子从 A 移动到 C
		hannuota(n - 1 ,c2, c1, c3); //最后将 B上的n-1 个盘子借助 A 移动到 C上
	}
}


int main(void) {
	
	printf("\n汉诺塔:\n");
	hannuota(5 ,'A', 'B', 'C');
	return 0;
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值