C语言初学者必知!河内塔问题算法、逻辑及代码实现

C语言初学者必知!河内塔问题算法、逻辑及代码实现 汉诺塔这个问题看上去仅仅是将一伙那堆积如山的碟子由一根那儿的柱子挪动到另一根所处的柱子然而它的挪动次数会跟随着盘子给出的数量呈现出爆炸式的增长态势。当那盘子的数量达到64个那样的地步依照每秒钟移动一回这样的速度来进行计算需要大概5850亿年这么漫长的时间才能够完成而这个时间跨度甚至已经超过了宇宙自身所拥有的年龄。递归思想是核心汉诺塔的解法不在意具体每一步究竟如何去挪动而是把握住一个关键规律那就是若要把n个盘子从A柱移至C柱就得先将上面n - 1个盘子从A柱移到B柱接着把最底下那个大盘子直接从A柱移到C柱最后再把B柱上的n - 1个盘子从B柱移到C柱。在这个历程当中移动n - 1个盘子时又再度重复同样的逻辑。程序在进行实现之际仅仅只需对一个hanoi函数付诸定义之举该函数会接纳四个参数分别为盘子的数量还有起始柱以及辅助柱另外还有目标柱。当盘子的数量等同于1的时候便径直输出移动的步骤。其余情况下也就是盘子数量不等于1的时候便会依照上面所讲述的三个步骤递归地调用自身。这样的一种写法将复杂的问题分解成为具有相同结构的子问题其代码显得极为简洁。移动次数指数增长关于汉诺塔的移动次数存在着一个精准的公式即2的n次方减1。当n等于1的时候移动的次数为1次。而当n等于2的时候移动的次数是3次。当n等于3的时候移动的次数为7次。随着n的不断增加移动的次数会迅速地翻倍。当n等于64的时候移动的次数大约是1.84乘以10的19次方这个数字大到超乎想象。按照每秒移动一回的速率来计算达成64个盘子的汉诺塔所需时间约为5850亿年当前科学界认定宇宙年龄约莫138亿年其中5850亿年等同于宇宙年龄的42倍此例子常常被用以向学生阐释指数级增长的可怖之处还展现了递归算法于处理这般问题之际的优势。费氏数列的自然规律计算机算法教学里费氏数列所处地位和汉诺塔相同都极重要此数列起始于1、1后来每一项均是前两项相加所得即1、1、2、3、5、8、13、21、34、55、89……其递推关系虽简易然而应用范围却极为广泛。自然界里费氏数列常常出现比如说向日葵种子的排列菠萝表面鳞片的数量蜜蜂的家族树甚至是某些花瓣的数量都契合这个规律。计算费氏数列之际可以用递归函数直接达成然而更具效率的做法是运用循环迭代从第三项起逐个递推计算如此就不会产生重复计算执行效率要高许多。组合数与打印模式从多个元素当中选取几个元素的方案所用的组合数C(n, k)得以体现从n个元素里选k个的情况计算之际能够运用公式C(n, k) n! / (k! (n-k)!)来进行求解。 只是在运用程序形式予以实现时为实现避开大数阶乘所产生的计算方面的花销通常会借助递推公式C(n, k) C(n, k-1) (n-k1) / k来逐一项展开计算。有一种递推的方式在打印杨辉三角的时候它显得格外有用杨辉三角每一行所对应的数字实际上就是组合数当把空格数量控制妥当之后能够借助循环逐个逐行地打印出来凭借观察循环变量的变化情形以及组合数的计算流程可以非常直观地去理解递推关系在实际编程里面的应用。三色旗排序问题来源于荷兰国旗问题的三色旗问题要求将蓝、白、红三种颜色的旗子以蓝、白、红的顺序排列在一起其约束条件为仅能交换相邻的旗子并且只能在一个数组内部进行操作同时不能使用额外的空间这个问题所考察的是怎样在有限的条件之下达成分类排序。解决的思路是设置三个指针分别是B、W、RB指向蓝色区域末尾W指向当前正处理的旗子R指向红色区域开头初始的时候B在开头R在末尾在遍历过程里如果W指向白色那么W直接向后移动如果指向蓝色互换B和W位置后两个指针都向后移动如果指向红色互换W和R位置后R向前移动当W超过R时所有旗子分类完成。指针移动控制流程于三色旗算法里头三个指针之所以移动的规则是将排序的效率做出了决定B指针一直在指着蓝色区域的最后一个位置往后边去W指针把整个数组都遍历了R指针一直在前头指向红色区域的第一个位置每次处于处理情况之际都凭W指定着的颜色来决定其中的操作并不需要另外的比较也无需回溯。这一算法的时间复杂度为O(n)仅仅只需对数组展开一回遍历。其空间复杂度为O(1)只是于原数组之上开展交换动作。在领会指针挪移逻辑之后能够将其扩展至更多颜色分类的情形是用于学习数组操作以及指针运用的经典实例。进行编程学习期间汉诺塔这种算法费氏数列那般的算法三色旗排序这类算法你对其中哪一个在理解的时候是最为费劲的呢欢迎于评论区去分享你的学习经历呀。