博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python递归详解+汉诺塔小案例
阅读量:6605 次
发布时间:2019-06-24

本文共 1694 字,大约阅读时间需要 5 分钟。

 

递归

    什么是?

递归式方法可以被用于解决很多的问题,因此它是中十分重要的一个概念。 绝大多数支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。 计算理论可以证明递归的作用可以完全取代循环,因此在很多函数(如Scheme)中习惯用递归来实现循环。 递归的强大之处在于它允许用户用有限的语句描述无限的对象。 因此,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的。 下面是对Python递归函数的简单了解:
# 类似与栈的先进后出模式 # 递归的两个必要条件# 1.要有递推关系# 2.要有临界def digui(num):    print('$'+str(num))    # 临界值    if num >0:        # 这里用的是调用本身的函数(递推关系)        digui(num-1)    else:        print('='*20)    print(num)    digui(3)
输出结果为:
$3$2$1$0====================0123

汉诺塔

什么是?

汉诺塔算法介绍

其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
⑴按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
⑶反复进行⑴⑵操作,最后就能按规定完成汉诺塔的移动。
所以结果非常简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
#----------------汉诺塔-----------------## 如果有n个圆盘,所需移动的步数为 2^n-1i = 0# 定义一个函数给4个参数n是圆盘的个数,a代表A柱子,b,c 函数里面的是形式参数def move(n,a,b,c):    # 把变量i全局化,如果不全局化,只可访问读取不能进行操作修改    global i    if n==1:        i += 1        print('移动第',i,'次',a,'-->',c)    else:        # 1.把A柱上n-1个圆盘移动到B柱上        move(n-1,a,c,b) # 传的才是实际参数        # 2.把A柱上最大的移动到C柱子上        move(1,a,b,c)        # 3.把B柱子上n-1个圆盘移动到C柱子上        move(n-1,b,a,c)        move(4,'A','B','C')

输出结果为:

移动第 1 次 A --> B移动第 2 次 A --> C移动第 3 次 B --> C移动第 4 次 A --> B移动第 5 次 C --> A移动第 6 次 C --> B移动第 7 次 A --> B移动第 8 次 A --> C移动第 9 次 B --> C移动第 10 次 B --> A移动第 11 次 C --> A移动第 12 次 B --> C移动第 13 次 A --> B移动第 14 次 A --> C移动第 15 次 B --> C

转载于:https://www.cnblogs.com/zhouzhishuai/p/8470607.html

你可能感兴趣的文章
Mysql按数字大小排序String字段
查看>>
python练习笔记——组合恒等式
查看>>
Qt封装QTcpServer参考资料--QT4中构建多线程的服务器
查看>>
MySQL DDL--ghost执行模板和参数
查看>>
开源一个Android自定义图表库
查看>>
IPV6地址格式分析
查看>>
DTLS-PSK算法抓包解析***
查看>>
ROS-RouterOS hAP ac2+usb 4G上网卡+小米新推的无线上网卡是绝配
查看>>
Eclipse常用快捷键
查看>>
nginx brotli 压缩试用
查看>>
Guava学习笔记(三):集合
查看>>
[转]Java中BigDecimal的使用
查看>>
ORA-30377 MV_CAPABILITIES_TABLE not found
查看>>
排序题如何进行数据分析
查看>>
博客园博客自动生成目录/目录索引
查看>>
ASP.NET Session and Forms Authentication and Session Fixation
查看>>
(转)IntelliJ IDEA java项目导入jar包,打jar包
查看>>
头皮脂溢性皮炎推荐联合治疗:采乐50ml+希尔生100g(请看详情页)
查看>>
【SSH网上商城项目实战12】添加和更新商品功能的实现
查看>>
Shiro后台实现验证权限
查看>>