深入Python(5):递归

来源:互联网 发布:mysql front怎么用 编辑:程序博客网 时间:2024/04/30 19:51

如果函数包含了对其自身的调用,该函数就是递归的。如下:

复制代码
"""非递归方式呈现"""sum = 0for obj in range(1,101):    sum+=objprint sum""""1+2+3+...+100"""def foo(n):    if n>0:return n+foo(n-1)    if n<=0:return 0print foo(100)"""阶乘"""def fac(n):    if n==0 or n==1:        return 1    else:        return n*fac(n-1)print fac(10)    
复制代码

注意:

如果在使用递归的时候,出现条件判断,一定要把所有可能出现的条件都进行相应的处理。例如累加,如果写成这样:

""""1+2+3+...+100"""def foo(n):    if n>0:return n+foo(n-1)print foo(100)

则会出错,可能有人会说,我只要满足条件就执行,不满足就不执行,但是不要忘了,如果一个Python函数被设计成不返回任何东西,它会返回None。出错如下:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in foo
  File "<stdin>", line 2, in foo
  ...
  File "<stdin>", line 2, in foo
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

这里插入一些关于递归的网方解释,因为我是从网上搜到的这些内容:
(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(比如Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)   

递归的缺点:递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

参考:http://www.cnblogs.com/balian/archive/2011/02/11/1951054.html

0 0