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 21 Python
Python常用的日期时间处理方法示例
Feb 08 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
Python入门_条件控制(详解)
May 16 Python
Python设计模式之代理模式简单示例
Jan 09 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
Python动态导入模块的方法实例分析
Jun 28 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
Django如何防止定时任务并发浅析
May 14 Python
wxPython实现文本框基础组件
Nov 18 Python
pytorch 实现查看网络中的参数
Jan 06 Python
基于Tensorflow高阶读写教程
Feb 10 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
PHP中对数据库操作的封装
2006/10/09 PHP
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
php 购物车完整实现代码
2014/06/05 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
JS高级笔记
2011/07/13 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
Farnell德国:电子元器件供应商
2018/07/10 全球购物
培训演讲稿范文
2014/01/12 职场文书
教师个人剖析材料
2014/02/05 职场文书
党员批评与自我批评
2014/02/12 职场文书
医学专业自荐信
2014/06/14 职场文书
加强作风建设心得体会
2014/10/22 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
学前班学生评语
2014/12/29 职场文书
周年庆典答谢词
2015/01/20 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript