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实现删除文件与目录的方法
Nov 10 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
Python实现图片转字符画的示例代码
Aug 21 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
使用python画社交网络图实例代码
Jul 10 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
django和vue实现数据交互的方法
Aug 21 Python
Python configparser模块配置文件过程解析
Mar 03 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
pandas 实现将NaN转换为None
May 14 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 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函数解决SQL injection
2006/10/09 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
Javascript实现的分页函数
2006/12/22 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
Python最长公共子串算法实例
2015/03/07 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
银行实习的自我鉴定
2013/12/10 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
2014年租房协议书范本
2014/10/30 职场文书
计划生育汇报材料
2014/12/26 职场文书