Python递归和迭代
2015-03-29 09:18
134 查看
递归
在函数内部,调用函数自身的编程技巧称为递归( recursion)。递归函数结构清晰,很直观的理解计算过程,但也有严重缺点:相对于普通循环而言,递归运行效率较低,经过很多冗余的计算,递归会消耗大量的调用堆栈。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧。每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,递归调用的次数过多,会导致栈溢出。因此,应该尽量用循环代替递归。
举个阶乘的例子,用函数 ca(n) 表示阶乘,ca(n) = n! = 1 * 2 * 3 * 4 * (n-1 ) * n = n * ca(n-1)
函数的计算过程是这样的:
迭代
利用 for 循环来遍历一个列表(list)或元组(tuple),将值依次取出,这种方法我们称为迭代。
我们可以用 for 循环类计算阶乘:
可以用函数来更加人性化阶乘:
Python还提供一个 reduce 函数,利用 lambda 匿名函数,一行代码便可以完成阶乘的计算:
在函数内部,调用函数自身的编程技巧称为递归( recursion)。递归函数结构清晰,很直观的理解计算过程,但也有严重缺点:相对于普通循环而言,递归运行效率较低,经过很多冗余的计算,递归会消耗大量的调用堆栈。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧。每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,递归调用的次数过多,会导致栈溢出。因此,应该尽量用循环代替递归。
举个阶乘的例子,用函数 ca(n) 表示阶乘,ca(n) = n! = 1 * 2 * 3 * 4 * (n-1 ) * n = n * ca(n-1)
def ca(n): if n == 1: return 1 return n*ca(n-1)
函数的计算过程是这样的:
(ca(5)) (4 * ca(5)) (3 * (4 * ca(5))) (2 * (3 * (4 * ca(5)))) (1 * (2 * (3 * (4 * (5)))))
迭代
利用 for 循环来遍历一个列表(list)或元组(tuple),将值依次取出,这种方法我们称为迭代。
for x in range(10): print x
我们可以用 for 循环类计算阶乘:
m = 1 for x in range(1,10): m *= x >>> print m >>> 3628800
可以用函数来更加人性化阶乘:
def factorial(x,y): m = 0 if x > 0: for n in (x,y+1): m *= n return m print factorial(1,10)
Python还提供一个 reduce 函数,利用 lambda 匿名函数,一行代码便可以完成阶乘的计算:
print reduce(lambda x,y: x*y, range(1,11))
相关文章推荐
- 迭代和递归(Python)--乘方、最大公约数、汉诺塔、斐波那契、回文字符串
- python 斐波拉契递归 尾递归 备忘录 动态规划 迭代
- python中的迭代与递归
- 王亟亟的Python学习之路(六)-递归,迭代,列表生成式
- python实现费波纳茨数列——递归、迭代
- Python的迭代和递归实现菲波那切数列(Fibonacci sequence)
- <Python> 递归展开嵌套列表等可迭代对象(list,dict,set...)
- Python学习中递归、迭代、生成器、函数式编程的思考
- python内置函数(2)-递归与迭代
- 求斐波那契数的python语言实现---递归和迭代
- SICP_Python版第三章:递归与迭代
- python2 递归与迭代的效率问题
- Python递归和迭代
- 王亟亟的Python学习之路(六)-递归,迭代,列表生成式
- Python yield from 递归迭代
- python语言实现阶乘的两种方法---递归和迭代
- 用java实现的迭代和递归插入排序
- 递归回溯与迭代回溯算法框架,打印在n个数字中取k个数字的所有可能
- 递归和迭代的区别和联系
- 关于DNS迭代递归及区域复制