目录
1.前言
有朋友说要我写一个解决汉诺塔问题的码,应邀而来,浅试一下水。问题比较经典,先上百度百科
当只有3个盘子时
2. 思路分析
那我们其实可以由简入繁。
当只有1个盘的时候,只用移动1次;
有2个盘的时候,需要移动3次;
有3个盘的时候,需要移动7次;
只要最大的盘在底下,那么这个最大的盘就可以忽略!!
那也就是说3个盘,我可以先把除最大外的所有盘弄到一堆,然后再移动最大盘到最右边,然后再将那一堆盘移回最右边。我们可以发现这个过程其实是有规律性的。
将n个盘替换掉上面的3个盘,是不是也同样是这个意思呢?!!
我们在移动3个盘的时候,除开移动最大盘的那一步,其实我们是在做移动2个盘的工作;
我们在移动2个盘的时候,除开移动最大盘的那一步,其实我们是在做移动1个盘的工作!!
那这时候高中数列就上场了
设移动n个盘子需要移动次,那把除了最大盘外的所有盘移出去是不是就需要移动次呢,移动最大盘需要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连一波,关注我,一起进步吧!!