不用说,你看到这个公式一定一脸懵逼,我现在来讲解这个公式的作用。
先来回想一下大象放冰箱要几步,三步吧,打开冰箱,放进去,关上门就行了,我们先不要去思考一些细碎的步骤,将一个复杂的问题先简单化,再慢慢去分析。
那汉诺塔问题也是同样的简单三步:(假设有n个盘子)
一、把最大的盘子留在a柱,然后将其他的盘子全放在b柱。
二、把最活水源记大的盘子放到c柱。
三、然后将b柱上的所有盘子放到c柱。
这就是汉诺塔的流程,汉诺塔的精髓就是上面三句话。
n层汉诺塔有(2^n-1)次移动,来将盘子全部从a盘到c盘.
相应我们可以写出对应的c语言递归公式:(n就是盘子的个数,xyz就是柱子的名字)
相信你肯定有很多疑问,我们现在先来举几个例子再解释问题吧。
一个盘子就不说了,因为最大的盘子就是他,所以他直接就去c盘了。
共三步:把最大盘上面的全部放到b,然后最大盘去c,再把剩余的盘全部放到c就行了。late的副词
这是两个盘,共移动三次就移动完了,那三个盘呢?
把全部过程堪称一个整体,最大盘上面的所有盘全部看成一个整体,我们也只用执行三个步骤,我们要利用把大事化小的观点,不要一上来就思考具体是怎么移动的,这样看不清问题的本质。
我们再来具体分析三步具体要怎么移动.
第一步中,我们要移动三次,分别是a->c、是a->b、c->b这就是一大次完整的移动,在这一步中,我们套用了上一次的汉诺塔公式进行使用,这就是汉诺塔的难点,接下来我给大家看个图,希望大家能理解,(n是层数,x,y,z则是函数参数)
汉诺塔的内部其实就像一个金字塔一样,其实每一次调用自己,就是按照上面所说精髓的公式调用自己,让自己的参数发生了变化。我希望大家能够自己去照着画一下流程,
第二步:将a到c,这就是将上图的第二步那写上第四次移动:a->c。
第三步,将b柱上的全部盘子借助a放到c
第七步完成后就会发现没有要执行的语句了,汉诺塔函数就结束返回到main函数了,自此求解汉诺塔函数的步骤就完成了。
好的,这样,我们移动三层汉诺塔的过程的就完成了,三次汉诺塔完成就算是解决了这个问题,因为即使盘子再多也就是一样的公式套用而已,明白两层和三层汉诺塔的运行原理就可以了,再多层的塔也是相同的流程。不难发现,递归就是让数学公式在c张召忠为什么叫局座语言中体现了出来,让问题变的十分”简单“。
剩下就是了程序的主函数部分了,这个问题的主函数就很简单,主函数只用传来盘子的数量和三个柱子的名字就行了;代码如下
#include <stdio.h>void change (char x,char y) //打印盘子移动轨迹的函数{ printf("%c->%c\n", x, y);}void f(n, x, y, z) //汉诺塔函数{ if (n == 1) { chang全国教师节画一等奖e(x, z); } el { f(n - 1, x, z, y); //公式一:将a柱最大盘外的盘子借助c柱移到b柱 change(x, z); //公式二:将a上最大盘移动到c柱 f(n - 1, y, x, z); //公式三:将b柱上的盘借助a全部放到c柱 }}int main()基础乐理{ int m; scanf("%d", &m); f(m, 'a', 'b', 'c');}
到此这篇关于带你理解c语言中的汉诺塔公式的文章就介绍到这了,更多相关c语言汉诺塔公式内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 16:50:17,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/18c6ebf92924dd60572ab292818c6ab6.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:带你理解C语言中的汉诺塔公式.doc
本文 PDF 下载地址:带你理解C语言中的汉诺塔公式.pdf
留言与评论(共有 0 条评论) |