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中使用SQLite的简单教程
Apr 29 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
Python中XlsxWriter模块简介与用法分析
Apr 24 Python
python八皇后问题的解决方法
Sep 27 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
django重新生成数据库中的某张表方法
Aug 28 Python
Python多线程获取返回值代码实例
Feb 17 Python
使用python计算三角形的斜边例子
Apr 15 Python
python logging通过json文件配置的步骤
Apr 27 Python
python中get和post有什么区别
Jun 19 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 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连接方式PDO使用详解
2015/02/25 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
python基础教程之Hello World!
2014/08/29 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
pycharm的python_stubs问题
2020/04/08 Python
什么是Python变量作用域
2020/06/03 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
时尚圣经:The Fashion Bible
2019/03/03 全球购物
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
指针和引用有什么区别
2013/01/13 面试题
最经典的商业地产项目广告词
2014/03/13 职场文书
单位介绍信格式
2015/01/31 职场文书
网络营销实训总结
2015/08/03 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
python爬虫--selenium模块
2021/03/31 Python
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫