目录
4.假设四层汉诺塔,n=4,利用整体思想分解为两层的情况
3.分解到n=3
3.1 分解上面n=4时第一个步骤:
3.2 分解上面n=4时第三个步骤:
2.继续分解到n=2 (同理略)
1.当分解到n=1
python代码
问题:把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作
分治思想,将复杂问题分解,寻找规律。
先不用细究张图,后面还会放一次。
4.假设四层汉诺塔,n=4,利用整体思想分解为两层的情况
图1
分解方法:上层三个(1,2,3)绿色部分当作一层和蓝色部分最下层(4),这下仅需考虑两层。
目标:本轮n=4,此时我们的目标就是将A处(起始处start)盘子,按照规则(一次移动一个盘子(将绿色一体视为一个盘子),且小盘子不能放到大盘子下面)全部移动到C处(目的地destination),当然肯定要借助B处(中继处t)进行移动。
记住,从n=4递归分解到n=1过程中, start、destination、t 跟A、B、C是相互独立的,我们仅从从哪里start,借助哪里t,到哪里destination这个视角考察问题,在这个过程中,A有可能是start也有可能是destination或t。
因为最后面我们找出的规律就是start->t , start->destination, t->destination
但只考虑两层时,步骤只有A->B、A->C、B->C,
对应n=4时对start、destination、t和ABC的对应关系,!!!对应起来就是start->t , start->destination, t->destination.
图2
图2中,红字部分出现的start和destination是作为下一轮即n-1轮分解的start和destination,但是在本轮B只是中继t,下面的分解同理。
然后,n=4时第一第三个步骤,实际上都需要将三层的盘子移动到别处(第一个步骤需要移动到B、第三个步骤需要移动到C),所以还需继续分解,第一第三个步骤都需要分解。
此时最底下最大的盘子已经在C最下边了,因此无论今后怎么移动其它盘子,只会比这个盘子小,因此,不需要再考虑它,可以当他不存在了。
3.分解到n=3
3.1 分解上面n=4时第一个步骤:
此时分解到n=3 。
分解方法:将三层的盘子,上两层作为一体,下面那层作为一层,这样也是化为两层移动的问题。
目标:此时我们的目标就是将A处(起始处start)盘子,按照规则(一次移动一个盘子,且小盘子不能放到大盘子下面)全部移动到B处(目的地destination),当然肯定要借助C处(中继处t)进行移动。
很巧的是,对应n=3时对start、destination、t和ABC的对应关系,!!!对应起来就是start->t , start->destination, t->destination.这个关系不变,这就是规律。
3.2 分解上面n=4时第三个步骤:
此时仍然还是n=3 。
分解方法:同理将三层的盘子,上两层作为一体,下面那层作为一层,这样也是化为两层移动的问题。
目标:此时我们的目标就是将B处(起始处start)盘子,按照规则(一次移动一个盘子,且小盘子不能放到大盘子下面)全部移动到C处(目的地destination),当然肯定要借助A处(中继处t)进行移动。
同理,对应起来还是start->t , start->destination, t->destination.这个关系不变
2.继续分解到n=2 (同理略)
1.当分解到n=1
n=1 此时分解到了尽头,可以作为求解问题的结束判断。
n=2分解时,一次仅需移动一块,实际上也仅需要移动一块,其移动步骤如A->B就不需要分解了,就相当于n=1
python代码
'''
参数1:本次调用是解决几层汉诺塔问题
参数2:希望汉诺塔从哪里
参数3:搬到哪里
参数4: 途中借助那个位置作为中继
'''
def hn(n,start,destination,t):
# 结束判断,分解到1时结束
# 为什么不是n==2结束,当n==2时,是刚n==3分解完递归到n==2,此时n==2轮递归还没有开始。
if n==1:
print(start+'->'+destination+'\n')
return
# 分解到n-1,借助找到的规律,start->t、start->destination、t->destination
# 为什么还要传入t,因为此时的t有可能是下一轮分解的start或destination
hn(n-1,start,t,destination)
print(start+'->'+destination+'\n')
hn(n-1,t,destination,start)
hn(4,'A','C','B')
参考博主:
汉诺塔(Hanoi)问题归纳总结_hanoi塔问题-CSDN博客