浅析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 相关文章推荐
Python程序语言快速上手教程
Jul 18 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
Mar 30 Python
Python 绘图和可视化详细介绍
Feb 11 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 Python
Python基础之hashlib模块详解
May 06 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
关于svn冲突的解决方法
2013/06/21 PHP
解析php常用image图像函数集
2013/06/24 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
解决Python使用列表副本的问题
2019/12/19 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
临床医学大学生求职信
2013/09/28 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
2014年度培训工作总结
2014/11/27 职场文书