(一)C语言汉诺塔问题(入门小白的每日总结)
通过运用递归函数来实现对汉诺塔及其他一些问题的解决。
首先来讲讲递归函数
递归函数分为直接递归和间接递归。
直接递归:在一个函数的运行中自己调用自己。
间接递归:在一个函数A中调用了另一个函数B的基础上,在函数B的运行中又再此调用了函数A。
然后就要结合高中所学过的数学归纳法
举个例子来理解下:
所以说,在做递归函数问题时,一定要先做好归纳法的分析,一步步从后往前推(如果是循环则是从前往后推)。还有要注意的是运用递归函数一定要有基准条件(有见过一些文章的说法将它称之为结束条件或者停止调用递归函数的限制条件)。
具体详解推荐看一个博客:
https://blog.csdn.net/SinvanChong/article/details/75305451?
汉诺塔问题:
古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上.在移动过程中可以利用B座.要求编程序输出移动盘子的步骤.
对于这个问题,乍看一下确实难,64个盘子,如果一个个的去划分,要把64个盘子从A座移到C座,需要移动大约2的64次方次盘子。但是这么多次到底要怎么要移动呢。从小呢我们也都知道,饭要一口口吃,路要一步步走啊。所以根据着上述理解,我从小一点的数开始推起。
假设只有三个盘子(大小程度i<j<k)
(1)k 不动,将 i 由A—》C,再将 j 由A—》B
最后可将 i 由C—》B。我们把这步总结下,就是:将 i & j 看成一个整体,将它们借助C从A—》B。
(2)将 k 由A—》C
(3)k 不动,将 i 由B—》A,再将 j 由B—》C。把这步总结下,就是&