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实现实例
Apr 26 Python
python生成器generator用法实例分析
Jun 04 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
Django 实现购物车功能的示例代码
Oct 08 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
如何基于python实现脚本加密
Dec 28 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
django使用多个数据库的方法实例
Mar 04 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
Django中celery的使用项目实例
Jul 07 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在服务器执行exec命令失败的解决方法
2012/03/03 PHP
php网站地图生成类示例
2014/01/13 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
numpy.random模块用法总结
2019/05/27 Python
Python configparser模块常用方法解析
2020/05/22 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
班组长岗位职责范本
2014/01/05 职场文书
商场父亲节活动方案
2014/08/27 职场文书
高中生旷课检讨书
2014/10/08 职场文书
2014年科研工作总结
2014/12/03 职场文书
追悼会答谢词
2015/01/05 职场文书
吴仁宝观后感
2015/06/09 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB
MySQL 语句执行顺序举例解析
2022/06/05 MySQL