【小白系列】用C语言解决汉诺塔问题

目录

1.前言

 2. 思路分析

3. 代码实现

4. 结语


1.前言

有朋友说要我写一个解决汉诺塔问题的码,应邀而来,浅试一下水。问题比较经典,先上百度百科

【小白系列】用C语言解决汉诺塔问题_第1张图片

 当只有3个盘子时【小白系列】用C语言解决汉诺塔问题_第2张图片

 2. 思路分析

 那我们其实可以由简入繁。

当只有1个盘的时候,只用移动1次;

有2个盘的时候,需要移动3次;

有3个盘的时候,需要移动7次;

只要最大的盘在底下,那么这个最大的盘就可以忽略!!

那也就是说3个盘,我可以先把除最大外的所有盘弄到一堆,然后再移动最大盘到最右边,然后再将那一堆盘移回最右边。我们可以发现这个过程其实是有规律性的。

将n个盘替换掉上面的3个盘,是不是也同样是这个意思呢?!!

我们在移动3个盘的时候,除开移动最大盘的那一步,其实我们是在做移动2个盘的工作;

我们在移动2个盘的时候,除开移动最大盘的那一步,其实我们是在做移动1个盘的工作!!

那这时候高中数列就上场了

设移动n个盘子需要移动a_{n}次,那把除了最大盘外的所有盘移出去是不是就需要移动a_{n-1}次呢,移动最大盘需要1次,把除了最大盘外的所有盘移回来是不是也需要移动a_{n-1}次呢?

可以得到公式:a_{n}=2*a_{n-1}+1

 我们知道 a_{1}=1,那么这样,问题是不是就能解决了呢?答案是正确的!!其实就是看问题的转化能力!!

3. 代码实现

由于2的思路已经分析的很彻底了,所以我不多讲,直接选择递归来计算。

//汉诺塔问题
int cpt(int n)
{
	if (n == 1)
		return 1;
	if (n != 1)
		return 2 * cpt(n - 1) + 1;
}
int main()
{
	int n = 0;
	printf("把n个盘子移动到最右边,请输入n的值:");
	scanf("%d", &n);
    //cpt函数用来计算次数,结果存在sum中
	int sum = cpt(n);
	printf("共需移动%d次",sum);
	return 0;
}

4. 结语

 这就是汉诺塔问题思路分析及其C语言实现方法,如果大家有什么想看的文章可以评论在下方,只要博主有能力做的一定用心写出好的文章!!最后还是求大家3连一波,关注我,一起进步吧!!

你可能感兴趣的:(小白系列,初阶练习,c语言,c++,开发语言)