在学习递归的过程中,相信每一个人都会遇到“汉诺塔”的求解问题,递归作为一种优雅的解法,可以在实现过程中巧妙的契合你的描述语言,所以三柱汉诺塔作为最基本的汉诺塔问题,很容易得解。但是当我们把柱数提高到4了,又该怎么解决了。
设F[n]为所求的最小步数,显然,当n=1时,F[n]=1;当n=2时,F[n]=3;如同经典汉诺塔一样,我们将移完盘子的任务分为三步:
- 将x(
)个盘子从a柱子上依靠b,d柱子移动到c柱子上,这个过程需要的步数为。
- 将a柱上剩下的n-x个盘依靠b柱移到d柱。这个过程需要的步数为
。(这个通项公式可以通过数学归纳法来求得,你可以写程序找规律,事实上n柱汉诺塔的公式在数学上好像已经得到解决。)
- 将c柱上的x个盘依靠a,b柱移到d柱上,这个过程需要的步数为
。
故完成任务所需要的总的步数 :
但这还没有达到要求,题目中要求的是求最少的步数,易知上式,随着x的不同取值,对于同一个n,也会得出不同的F[n]。即实际该问题的答案应该
,其中
,我们可以用循环的方式,遍历x的各个取值,取x的各个取值中的F[n]的最小值。
MOOC数据结构与算法Python版-第五周编程作业_Python_suxiaorui的博客-CSDN博客blog.csdn.net
#python迭代实现
另一种解法,并加上动态规划,减少时间复杂度:
def
有用的就点个赞吧~~
算法小白,码字不易。