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中函数的参数与作用域
Mar 20 Python
Python while 循环使用的简单实例
Jun 08 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
Django 反向生成url实例详解
Jul 30 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
python爬虫-模拟微博登录功能
Sep 12 Python
NumPy统计函数的实现方法
Jan 21 Python
python实现横向拼接图片
Mar 23 Python
python如何求100以内的素数
May 27 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 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读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
JS target与currentTarget区别说明
2011/08/28 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
Vue基础配置讲解
2019/11/29 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
后勤人员自我鉴定
2013/10/20 职场文书
广告词串烧
2014/03/19 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
教师节座谈会主持词
2015/07/03 职场文书
学校安全管理制度
2015/08/06 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Python中tqdm的使用和例子
2022/09/23 Python