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 获取et和excel的版本号
Apr 09 Python
对于Python中线程问题的简单讲解
Apr 03 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
Python处理文本换行符实例代码
Feb 03 Python
python使用turtle库绘制树
Jun 25 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
python中的None与NULL用法说明
May 25 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
python实现学生信息管理系统(面向对象)
Jun 05 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中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
web.py获取上传文件名的正确方法
2014/08/26 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
详解Python3的TFTP文件传输
2018/06/26 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python raise的基本使用
2020/09/10 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
Python读写锁实现实现代码解析
2020/11/28 Python
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
骆驼官方商城:CAMEL
2016/11/22 全球购物
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
电子商务专业应届毕业生求职信
2014/06/21 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
python使用glob检索文件的操作
2021/05/20 Python
基于JavaScript实现年月日三级联动
2021/06/22 Javascript