汉诺塔详解过程和递归思想及举例(python代码)

省略问题描述…

  • 但我们知道64个盘子的移动次数是18 446 744 073 709 551 615这是一个天文数字

解决办法:

我们最终解决的问题就是将a柱子原来由大到小从下到上排好序的圆盘通过b柱子移动到c柱子上即可
如图:

在这里插入图片描述

  • 1先定义递归函数hanio(n,a,b,c),该方法表示将n个盘子从a柱子借助b柱子移动到c柱子。
  • 若a柱子上只有一个盘子,此时n=1,则可以直接将盘子从a柱子移动到c柱子上,问题得到解决,但是我有个疑问,这种情况(也就是中间移动出现的过程),a柱子上也只有一个盘子,怎么理解呢?
    忽略,还没讲完,请看下面讲解
    -在这里插入图片描述
  • 若a柱子上有一个以上的盘子,即n>1,此时需要考虑三个步骤。

1先将n-1个盘子从a柱子借助c柱子移动到b柱子,如图:

在这里插入图片描述

2.将a柱子上剩下的第n个盘子移动到c柱子上

在这里插入图片描述

3.将b柱子上的n-1个盘子借助a柱子上移动到c柱子上,最后完成移动!如图:
在这里插入图片描述

python代码

# 汉诺塔
def hannio(n,a,b,c):
    if n==1:
        print("move dish %d from %c to %c" % (n, a, c))
    else:
        hannio(n-1,a,c,b)
        print("move dish %d from %c to %c" % (n, a, c))
        hannio(n-1,b,a,c)

print(hannio(4,'a','b','c'))

递归函数返回值原理:

在这里插入图片描述

递归是什么?
原理:函数自己调用自己的过程,怎么理解呢?也就是函数可以调用函数里面的所有的函数包括本身。
举例:第一个是阶乘(factorial),第二个是进制转换,看代码:

#阶乘和
def factorial(n):
    if n==1:
        return 1
    else:
        return n*factorial(n-1)
n=int(input())#输入一个整数
result=factorial(n)
print("数字%d的阶乘和为:%d"%(n,result))
#进制转换
def toStr2(n,base):

    convertString='0123456789ABCDEF'

    if n == 0:

        return ''
    else:

        return toStr2(n // base, base) + convertString[n % base]

n,m=map(int,input().split())
result=int(toStr2(n,m))
print("%d转化为%d进制后为:%d"%(n,m,result))

ok,结束!

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-berry

互相学习就是最好的学习

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值