欢迎斧正
目录
一、问题描述
有A、B、C、三个柱子,其中A上存在N个盘子,从上到下盘子依次增大;先要将盘子移到B上去,但是在移动的过程中,不能出现大盘子在小盘子的上面的情况,C作为辅助;
二、问题分析
图解:
我们可以将问题细分:
1、移动A上N个盘子,我们先移动A上1~N-1个盘子,借助B移到C上去,出现上图中4的那种情况
2、这样A上就剩下了一个最大的盘子,我们将其移到B上去
3、到这问题又回归到了初始情况,只是角色互换了一下(B上面的盘子最大,又是我们最终移动的目标,所以B上那个盘子不要动,相当于没有),就是将C上1~N-1个盘子借助A移动到B
至此可以达到我们的需求
三、代码实现
def f(N, from_d, to_d, help):#函数的三个参数表名题目描述中A为初始,B为目标,C为辅助
if N == 1:
print("{} -> {}".format(from_d, to_d))
return
f(N-1, from_d, help, to_d)#第一步,以B为辅助移到C,将A上n-1个盘子
print("{} -> {}".format(from_d, to_d))#第二步,再将A剩下的一个移到B上
f(N-1, help, to_d, from_d)#第三步,以A为辅助移到B上,将C上n-1即所有的盘子
if __name__ == '__main__':
f(3, "A", "B", "C")
结果:
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B