Python递归函数定义与用法示例


Posted in Python onJune 02, 2017

本文实例讲述了Python递归函数定义与用法。分享给大家供大家参考,具体如下:

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n

所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:

def fact(n):
if n==1:
return 1
return n * fact(n - 1)

上面就是一个递归函数。可以试试:

>>> fact(1)
1
>>> fact(5)
120
>>> fact(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L

如果我们计算fact(5),可以根据函数定义看到计算过程如下:

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试计算 fact(10000)。

def digui(n):
  sum = 0
  if n<=0:
    return 1
  else:
    return n*digui(n-1)
print(digui(5))

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现partial改变方法默认参数
Aug 18 Python
python利用beautifulSoup实现爬虫
Sep 29 Python
Python注释详解
Jun 01 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Python线程指南详细介绍
Jan 05 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
python实现WebSocket服务端过程解析
Oct 18 Python
python线程信号量semaphore使用解析
Nov 30 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
Python如何存储数据到json文件
Mar 09 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 #Python
Python 爬虫图片简单实现
Jun 01 #Python
Python 通过URL打开图片实例详解
Jun 01 #Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 #Python
python 内置函数filter
Jun 01 #Python
python读取二进制mnist实例详解
May 31 #Python
Python算术运算符实例详解
May 31 #Python
You might like
php页面函数设置超时限制的方法
2014/12/01 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
js加解密 脚本解密
2008/02/22 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
Python实现对adb命令封装
2020/03/06 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
房地产活动策划方案
2014/05/14 职场文书
廉政承诺书
2015/01/19 职场文书
小学运动会入场词
2015/07/18 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
小学感恩主题班会
2015/08/12 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书