python,汉诺塔问题

 初学编程,汉诺塔的数学问题倒是很好看懂,就是在编程上卡了好久

  def move(n,a,b,c)

         if (n=1):

print(a,'----------->',c)

else:

move(n-1,a,c,b)

move(1,a,b,c)

move(n-1,b,a,c)

move(n,a,b,c)

  print.....


在递归函数的调用上,我卡在这里,搞不清楚的是,为什么move(n-1,a,c,b) 就让所有的盘子,到了b,且print a---->c就把过程全部打出来了?  为什么?会打出所有步骤,

   因为上面的move(n,a,b,c)调用了下面三个函数可以实现盘子达到目标,同样,当move(n-1,a,c,b)被递归调用时,会再次调用下面三个函数,这样循环往复,直到,move(1,a,b,c)。这样就实现了所有的盘子到b。 

  这个抽象的调用和思考过程就是,每一个move不断循环调用下面的三个move函数步骤,直到n=1,print a--->c,这样反过来开始推,就推出了所有步骤。跳会if n=1, print a--->c。的所有构成。

   注意函数在打印递归的时候是按照当只剩一个盘子的时候,开始反向推的步骤,

  是按照move的三个顺序打印的。

  

  也就是n=1,的时候直接打印a--c

 n=2的时候,打印下面的第一个move(a--b)然后move a--b

n=3的时候,反退,move(3,a,b,c)调用move(2,a,c,b)....等下面那三个函数实现目标,但是move(2,a,c,b)有返回来调用(move1,a,b,c)下面的那三个函数,形成递归。

 这是数学意义上的递归。

  也就是当对象实现数学意义上的递归的时候,我们在编程上就可以循环调用递归函数,实现自己的编程目标。是关于抽象思维,数学思维的一种总结。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值