python 数据结构 递归经典实例 汉诺塔(河内之塔)
Posted allmenmustdie123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 数据结构 递归经典实例 汉诺塔(河内之塔)相关的知识,希望对你有一定的参考价值。
# 汉诺塔 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\')
运行结果:
三个柱子画一画,自己摆一下就懂了,递归的经典实例,懂了就差不多懂递归的思想了,就是大化小,小是结束条件,一直划分到能解决的小条件,和分形树的思想类似,每一步的递归子步都和上一步一样的划分步骤。
以上是关于python 数据结构 递归经典实例 汉诺塔(河内之塔)的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 以递归方式做河内塔问题的基准.n = 20来自维基百科的伪代码:https://zh.wikipedia.org/wiki/汉诺塔
Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力