参考:

一、递归函数两大要素 -- 终止条件和递归方程

1、递归方程,即递归调用的方法
递归通俗的说就是在函数内部自己调用自己,如何调用就是递归方程。
以以下的sum(n)求和函数递归实现方式为例,递归调用方式就是返回n+sum(n-1),这样sum(n)的计算方式就类似如下:

sum(n)=n+sum(n-1) #递归方程,以下为其展开
sum(n)=n+(n-1)+sum(n-2)
...
sum(n)=n+(n-1)+(n-2)+...+sum(1)

到这里递归循环就应该结束了,很自然的我们得到了递归循环的结束条件:n=0,此时的返回就不是0+sum(-1)了,直接返回0结束循环即可。

2、终止条件,即从哪里开始和结束
从哪里开始和结束要分情况,在上例中有明确的结束条件n=0,n>0则进入递归循环,其隐形的条件就是n不能小于0,因此其开始条件写个n>0即可。
而其他场景例如遍历B树这种,开始一定是根节点,结束时一定是叶子结点,那么只要开始处理下根节点的打印,之后递归循环子节点即可,因此初始返回值就是根节点相关,之后递归调用以便遍历子节点和后代节点们,终止条件就是找不到子节点。

二、递归函数示例:

#!/usr/bin/env python
def sum(list):
sum = 0
# Add every number in the list.
for i in range(0, len(list)):
sum = sum + list[i]
# Return the sum.
return sum
print(sum([5,7,3,8,10]))
#!/usr/bin/env python
def sum(list):
if len(list) == 1:
return list[0]
else:
return list[0] + sum(list[1:])
print(sum([5,7,3,8,10]))

以上两个函数,第一个使用普通循环方式求和,第二个使用递归循环的方式求和,从效率来讲第一个更好,从逻辑上来讲递归函数更加清晰简洁。

三、递归的限制条件:
递归函数使用栈来存储函数调用,过多的递归会导致栈溢出,例如sum([一个超长的序列]),因此平时推荐使用简单循环即可,但是遇到需要进行多层循环或者根本不清楚循环层数的场景,递归就很有用了,只要确定了终止条件和递归方程就可以实现遍历。
在Python中递归超过1000此就会报出:“RuntimeError: maximum recursion depth exceeded”报错,因此递归也不是无限循环的,这个值也可以修改,你需要大致估算下你的递归次数,然后通过以下方式修改:

#!/usr/bin/env python
import sys
sys.setrecursionlimit(5000)
#阶乘实现示例:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
print factorial(3000)

 四、递归函数的使用场景:

一些场景下循环层次数未知,使用递归会非常简便,例如遍历xml文件节点的代码:

#coding=utf-8
from xml.dom.minidom import parse
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
root=parse('<xml文件名>').documentElement
#开始遍历节点
def iter_xmlNodes(node):
if node == None:
return
if node.nodeType == node.ELEMENT_NODE: #只有ELEMENT_NODE类型的node才有遍历的必要
print ("ELEMENT Node:%s" %(node))
for child in node.childNodes:
iter_xmlNodes(child)
else:
print ("Node:%s, NodeType:%d" %(node,node.nodeType))
#对于前两个if,第一个if表示终止条件,第二个if表示对输入节点的处理,对其子节点执行递归。
iter_xmlNodes(root)

最新文章

  1. CSS3动画快速实现
  2. 前端框架bootstrap 表单和导航菜单的 Demo(第二篇)
  3. Sphinx : 高性能SQL全文检索引擎
  4. 100天后 - 100-days-later
  5. 通过MD5排除重复文件
  6. shell 常用命令
  7. 【转】HADOOP HDFS BALANCER介绍及经验总结
  8. BFS POJ 3278 Catch That Cow
  9. 一些html页面资料
  10. C# 时间现实问题(12小时制与24小时制)
  11. LeetCode Sort Colors (技巧)
  12. 【转】IOS 开发环境,证书和授权文件等详解
  13. Hadoop 学习笔记 (十) hadoop2.2.0 生产环境部署 HDFS HA Federation 含Yarn部署
  14. rcp命令
  15. 在 .pro里加入 QMAKE_CXXFLAGS += /MP 将并行编译,加快编译速度(姚冬的办法)
  16. Scala类型参数中协变(+)、逆变(-)、类型上界(&lt;:)和类型下界(&gt;:)的使用
  17. Docker集群实验环境布署--swarm【3 注册服务监控与自动发现组件--consul】
  18. JS或jQuery实现一组复选框的全选和取消全选?
  19. 微信小程序解密得到unoinid和手机号 (开放数据的校验和解密 获取手机号)
  20. WPF自定义控件(一)の控件分类

热门文章

  1. Dynamics 365中自定义工作流活动更新了输入输出参数后获取的方法
  2. iOS----------Runtime 获取属性列表 方法列表
  3. 粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则
  4. SqlServer中用SQL语句附加数据库及修改数据库逻辑文件名
  5. Exchange-重建见证服务器和目录
  6. Linux 桌面玩家指南:03. 针对 Gnome 3 的 Linux 桌面进行美化
  7. 记录DEV gridview获取行列数据方法
  8. 机器学习之支持向量机—SVM原理代码实现
  9. python3打开winodows文件问题
  10. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引