递归
在函数内部,程序调用自身的编程技巧称为递归( 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))
时间: 2024-12-28 17:35:58