编程学习记录——递归解决汉诺塔问题

1. 对递归的理解,传递再回归,首先要设计一个基准情形,这个基准情形,在某些情况下,它无需递归就能解出。
2.然后将遇到的问题可以分解为基准情形,与非基准情形,非基准情形也能再分解为基准情形与非基准情形。
3.如汉诺塔,假设圆盘数为4,那么就可以把最上面三个圆盘看为一个整体,与最下面一个圆盘组成四个圆盘,而基准情形就是当只有一个圆盘时该如何移动 。4阶分解为3阶和1阶,3阶分解成2阶和1阶,2分解成1阶和1阶.
4.事实上,在汉诺塔问题中,1阶的移动可以看成是从A柱直接移动至C柱
5.而在二阶中,第一步A先移动至B,第二步A再移动至C,第三步B移动至C。
6.我们知道,当一阶时A直接移动至C,所以,我们可以将第一三步看成非基准情形,第二步看成基准情形。
7.第一步,可以看做A是起始柱,C为中间柱,B是目标柱的一阶情形,第三部,可以看成是B为起始柱,A是中间柱,C是目标柱的一阶情形。
8.所以二阶的移动可以分成三步,
1.小圆盘A<C>B的一阶移动。2.大圆盘A移动至C。3.小圆盘B<A>C的一阶移动。
三阶便把最上面两个圆盘视为整体,最下面一个圆盘为基准情形,四阶便把最上面三个视为整体........

void move(char A, char C)
{
	printf("%c柱顶部圆盘移动至%c柱\n", A, C);
}
void HNT(char A, char B, char C,int n)
{
	if (n == 1) move(A, C);
	else
	{
		HNT(A, C, B, n - 1);
			move(A, C);
		HNT(B, A, C, n - 1);
	}
}
int main()
{
	char A = 'a';char B = 'b';char C = 'c';//A起始柱,B中转柱,C目标柱
	int x = 4;//圆盘数
	HNT(A, B, C, x);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值