|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 漫星闪 于 2022-11-5 12:00 编辑
大家好,今天是每周一练第十四期。
这次的每周一练由我帮助用户@高山 发帖
题目名称:三环汉诺塔
题目说明:在一根柱子上从下往上按照大小顺序摞着3片黄金圆盘,需要移动圆盘。圆盘从下面开始按大小顺序重新摆放在另一根柱子上.任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
思路提示:递归方法
程序代码:[/hide]
为了学习zhuangjinxuan同学,我也把把帖子设置成了问题求助,效率高的代码将会被评为最佳答案!所以请踊跃回答哦
- '''
- 汉诺塔个数>1,即至少有两个
- 从上往下对盘标号为1~n
- 对于2的情况,把1从A移到B,再把2从A移到C,最后把1从B移到C
- 对于n>2我们把第n个,因为最大,可以看做底盘,所以只需要把1~n-1从A移到B,再把n从A移到C,最后把1~n-1从B移到C
- 这样就形成了递归关系,代码如下
- 注意不要被ABC误导了,我们的最终目标是以A为起点,B为中介,C为终点;而在移动1~n-1时,A是起点,C是中介,B是终点。ABC只是代表地点而已
- '''
- def move (n, from_, to):
- print(f"move {n} from {from_} to {to}")
- def hano(n, A, B, C):
- '''
- n: 个数
- A: 起点
- B: 中介
- C: 终点
- '''
- if n==2:
- move(n-1, A, B)
- move(n, A, C)
- move(n-1, B, C)
- else:
- hano(n-1, A, C, B)
- move(n, A, C)
- hano(n-1, B, A, C)
- hano(5, 'A', 'B', 'C')
- # 2.步数的计算
- '''
- f(n)=f(n-1) + 1 + f(n-1)
- 即 f(n)=2f(n-1)+1
- 构造为 f(n)+1=2[f(n-1)+1]
- 用等比数列计算得到f(n)的通项公式 f(n)=2**n - 1
- 或者move函数 加个计步的全局变量,move一下加一下
- '''
复制代码
|
|