浅析python递归函数和河内塔问题


Posted in Python onApril 18, 2017

关于递归函数:

函数内部调用自身的函数。

以n阶乘为例:

f(n) = n ! = 1 x 2 x 3 x 4 x...x(n-1)x(n) = n x (n-1) !

def factorial(n):
   if n==1:
     return 1
   return n * f(n-1)

//调用过程如下:

>>f(5)
>>5 * f(4)
>>5 * 4 * f(3)
>>5 * 4 * 3 * f(2)
>>5 * 4 * 3 * 2 * f(1)
>>5 * 4 * 3 * 2 * 1
>>120

从上面的例子可以直观得看到递归函数在不断的调用自己的函数,直到n==1(函数出口)。

关于河内塔:

规则:

1. 三根柱子,A,B, C

2. A 柱子上的盘子从小到大 排列,最上面的是最小的,最下面的是最大的。

3. 将A上的盘子移动到C上,移动过程中始终保持,最大的在下面,最小的在上面。

假设 A 柱子上有一个盘子,可以直接从A移动到C完成:

A --> C

假设 A 柱子上有两个盘子,需要借助B,移动到C:

A --> B

A --> C

B --> C

将A 最上面的盘(2-1)移动到B,然后将A中剩下一块盘移动到C,最后将B中的盘移动到C

假设 A 柱子上有三个盘子,需要借助B移动A 上面的两个盘,然后将A剩下最大的盘移动到C,最后将B中的盘移动到C。

A --> C

A --> B

C --> B  //这三步将A上前两个盘子移动到B

A --> C //这一步将A上最大的盘子移动到C

B --> A

B --> C

A --> C //后面这三步将B上的盘子移动到C

原理是将 A 上的(n-1) 块盘移动到B,然后A中剩下的,也是最大的一块盘移动到C,最后将B上(n-1)块盘移动到C。

def Hanoi(n , a, b, c):
  if n==1:
    print (" Hanoi Tower move", a, "-->", c)
    return
  Hanoi(n-1, a, c, b)
  Hanoi(1, a, b, c)
  Hanoi(n-1, b, a, c)
print (" When there is 1 ring on A")
Hanoi(1, 'A', 'B', 'C')
print (" When there are 2 rings on A")
Hanoi(2, 'A', 'B', 'C')
print (" When there are 3 rings on A")
Hanoi(3, 'A', 'B', 'C')
print(" When there are 4 rings on A")
Hanoi(4, 'A', 'B', 'C')

以上所述是小编给大家介绍的python递归函数和河内塔问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
Python将图片转换为字符画的方法
Jun 16 Python
Python数据结构之图的应用示例
May 11 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python实现快递价格查询系统
Mar 03 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
pycharm 关掉syntax检查操作
Jun 09 Python
Django实现内容缓存实例方法
Jun 30 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Python anaconda安装库命令详解
Oct 16 Python
Python使用正则表达式实现文本替换的方法
Apr 18 #Python
Python外星人入侵游戏编程完整版
Mar 30 #Python
Python随机数用法实例详解【基于random模块】
Apr 18 #Python
django使用图片延时加载引起后台404错误
Apr 18 #Python
使用Python3制作TCP端口扫描器
Apr 17 #Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 #Python
Python的时间模块datetime详解
Apr 17 #Python
You might like
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
js 回车提交表单两种实现方法
2012/12/31 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
Python如何使用函数做字典的值
2019/11/30 Python
Django choices下拉列表绑定实例
2020/03/13 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
中间件分为哪几类
2016/09/18 面试题
年终自我鉴定
2013/10/09 职场文书
中专生学习生活的自我评价分享
2013/10/27 职场文书
平安工地建设方案
2014/05/06 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
大学学生个人总结
2015/02/15 职场文书
2019年最新借条范本!
2019/07/08 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android