python 数据结构 递归经典实例 汉诺塔(河内之塔)
2021-05-01 01:28
标签:mamicode 实现 def 数学 条件 分支 分形 move 数据结构 运行结果: 三个柱子画一画,自己摆一下就懂了,递归的经典实例,懂了就差不多懂递归的思想了,就是大化小,小是结束条件,一直划分到能解决的小条件,和分形树的思想类似,每一步的递归子步都和上一步一样的划分步骤。 python 数据结构 递归经典实例 汉诺塔(河内之塔) 标签:mamicode 实现 def 数学 条件 分支 分形 move 数据结构 原文地址:https://www.cnblogs.com/liuchaodada/p/13222041.html# 汉诺塔 hanoi
# 大象放进冰箱里分机构步骤?
# n = 1 (a -> c) 2^1 - 1
# n = 2 (a -> b) (a -> c) (b -> c) 2^2 - 1
# | - move 1 from a to c
# | - move 2 from a to b | - move 1 from a to b
# | - move 1 from c to b
# n = 3 | - move 1 from a to c | - move 1 from a to c 2^3 -1
# | - move 1 from b to a
# | - move 2 from b to c | - move 1 from b to c
# | - move 1 from a to c
# | - move n-2 from a to c
# | - move n-1 from a to b | - move 1 from a to b
# | - move n-2 from c to b
# n = 3 | - move 1 from a to c | - move 1 from a to c 2^n -1
# | - move n-2 from b to a
# | - move n-1 from b to c | - move 1 from b to c
# | - move n-2 from a to
# 数学递推式 通项公式求解
# F(n) = 2*F(n-1) + 1 = 2^n - 1
# F(1) = 1
# F(2) = 2*(F(1))+1 = 3
# F(3) = 2*(F(2))+1 = 7
#
# 很明显,我们可以把n这个大问题不断不断地拆解,最终拆解成n=1,把铜片从a放到c这个最终的小问题
# n = n 时还是分三步 1. 把n-1个铜片从a移到b 2. 把最大的铜片从a移到c 3.把在b上的n-1个铜片从b移到c
# n = n-1时,还是分三步 1. 把n-2个铜片从a移到b 2. 把最大的铜片从a移到c 3.把在b上的n-2个铜片从b移到c
# 只不过相对顺序变了上部的 n-1 递归分支,原来的(a b c)变成了 (a c b),
# 因为在函数里我们 n = 1 时是第一个放到第三个里面, n-1 递归部分总体是 a -> b,所以要调换形参,次序变为 (a c b)
# 同理下部的 n-1 递归分支 ,实现的是 b -> c ,调换形参,次序变为 (b a c)
def move(n,a,b,c):
#a,b,c分别是三根柱子,n为套在a柱上的圆圈个数
if n==1:
print(a,‘-->‘,c)
return
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
move(3,‘A‘,‘B‘,‘C‘)
上一篇:[leetcode]215. 数组中的第K个最大元素
下一篇:python 面经
文章标题:python 数据结构 递归经典实例 汉诺塔(河内之塔)
文章链接:http://soscw.com/index.php/essay/80644.html