C语言 汉诺塔问题

本文通过汉诺塔问题介绍递归的基本概念及实现方法。详细分析了如何利用递归算法解决汉诺塔问题,包括递归过程中的交接点和递归结束的判断条件。并提供了一个具体的C语言实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汉诺塔问题对栈和递归的运用有更好的理解,属于递归初级比较经典的案例
解决递归问题最好的办法就是放弃深入思考,找到它的交接点和递归结束的判定点是最重要的
A B C   想把环从A移到C上,且只能把小环放在大环上面来移动

环数为1时:
A->C
----------------------------------
环数为2时:需要有B当个暂放点
A->B
A->C   //递归的交接点
B->C
交换2^2-1次
----------------------------------
环数为3时:
A->C
A->B
C->B
A->C   //递归的交接点
B->A
B->C
A->C
交换2^3-1次

-----------------------------------

以下代码:
#include<stdio.h>
#include<stdlib.h>
static int cnt = 0;
void printHNT(char A, char B,int n) {
	printf("第%d次移动:移动'%d'从%c -> %c\n", ++cnt, n, A, B);
}
void HanNuoTa(char A, char B, char C, int n) {
	if (n == 1) {
		printHNT(A, C, 1);//设置递归打印的开始,和递归结束的条件
		return;
	}
	HanNuoTa(A, C, B, n - 1);//大于1的话,让B作为缓冲点,并在此函数内递归2^(n-1)次
	printHNT(A, C, n);//递归完后回到主线程递归的交接点上,让最后一个环移动到C上
	HanNuoTa(B, A, C, n - 1);//交换A和B立场,让B里的n-1个环进行2^(n-1)次递归
}
int main() {
	char A = 'A', B = 'B', C = 'C';
	int n;
	printf("输入环的数目:");
	scanf("%d", &n);
	HanNuoTa(A, B, C, n);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值