码迷,mamicode.com
首页 > 编程语言 > 详细

python 汉诺塔

时间:2017-07-13 17:17:23      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:ref   帮助   type   汉诺塔   编写   最大   函数   分享   content   

基本介绍

技术分享汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔是根据一个传说形成的一个问题:

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

每次只能移动一个圆盘;

大盘不能叠在小盘上面。

提示:可将圆盘临时置于A杆,也可将从B杆移出的圆盘重新移回B杆,但都必须尊循上述两条规则。

问:如何移?最少要移动多少次?

python实现方法:递归法

我们最终得到的结果是将所有的圆盘按规定的方法从B移到C,对于C来说,当第n个盘子(最大的那个盘子)移动到C时,已经固定了,以后的操作都不用动这块盘子,而当这个盘子从A移动到C的前一步是其它n-1个盘子应该是在B上了,依次类推,当第n-1个盘子从B移动到C前,之前的n-2个盘子应该是在A上

总结以上的思路,可以将整个过程分三步走:

Step1.把除了最大的环之外的环,从A移动到B
A -> B
Step2.将最大的环从A移动到C
A -> C
Step3.把除了最大的环之外的环,从B移动到C
B -> C

参照下图

技术分享

(a)是初始状态,也就是递归的起点,我们假设n=4, move(4,A,B,C)还是请参考现在最高的分的代码哈~写这个是帮助大家更清楚那个让人压力大的(“抽象”)两个字,哈哈
<这个函数要实现的功能是把n个环从A按照一定的规则,借助B,移动到C>

(b)是step1完成的时候的状态,已经将所有的n-1,这里也就是3个环从A挪到了B
<第一处递归,move(n-1,A,C,B) 这个函数要实现将n-1个环从A,借助C,移动到B>

(c)是step2,此时需要将第n个,也就是第四个最大的环从A挪到C
<move(1,A,B,C),或者干脆直接print("A -> C")>

(d)是step3,此时需要将B上面的n-1个环从B挪到C<第二处递归>
<第二处递归,move(n-1,B,A,C) 这个函数要实现将n-1个环从B,借助A,移动到C>

 

Python编写代码如下:

#!/usr/bin/python

def move(n,a,b,c):

If n == 1:

  Print(a,’-->’,c)

else:

  Move(n-1,a,c,b)  #将A上面的n-1个盘子通过C移动到B

  Move(1,a,b,c)     #将A上最大的那个盘子通过B移动到C

  Move(n-1,b,a,c)  #将B上的n-1个盘子通过A移动到C

 

python 汉诺塔

标签:ref   帮助   type   汉诺塔   编写   最大   函数   分享   content   

原文地址:http://www.cnblogs.com/chishui20170713/p/7161477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!