汉诺塔递归思想解析

 

 

 

汉诺塔思想及代码解析

a7cd417a9a0b4fcf9c9b514905c5dd95.png

 

 

如果要将A柱上的n个盘子移到C柱上,就需要

先将前n-1个盘子从A柱借助C柱移到B柱,这时A柱上只剩下了第n个盘子

直接将第n个盘子从A柱移到C柱

再将B柱上的n-1个盘子借助A柱移到C柱

 

但是,如何将前n-1个盘子从A柱借助C柱移到B柱上去呢?就需要

先将前n-2个盘子借助B柱移到C柱

直接将第n-1个盘子从A柱移到B柱

再将C柱上的n-2个盘子借助A柱移到B柱

虽然两者借助的柱子不同

但是,移动n个盘子和移动n-1个盘子是等价的

这里给出伪算法

if(只有一个盘子)    直接将盘子从A移到Celse    先将前n-1个盘子借助C柱移到B柱    直接将第n个盘子从A柱移到C柱    再将B柱上的n-1个盘子借助A柱移到C柱

 

用python写出的代码

def move(n,A,B,C):#    if(n==1):        print(A+'->'+C)    else:        move(n-1,A,C,B)        print(A+'->'+C)        move(n-1,B,A,C)

注意,print(A+'->'+C)这条语句,并不是要打印形参A和形参C对应的实参值,而是打印move这个函数第二个和第四个形参所对应的实参。在每次循环调用中,形参所对应的实参都是会变的。

我们来看个实例,调用

move(3,'A','B','C')

函数具体实现如下:

58ecaaaeb6fe41a99f56102085a36491.png

在函数执行过程中,我认为它的执行顺序和数据结构的栈一样,遇到一条打印语句先把它压到栈中,直到循环结束,先执行最后进栈的print语句,最后执行第一个进栈的print语句。

希望这篇文章能够帮到大家,如有错误请多多指正。

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值