一般的递归函数:
def a(n):
if n == 1:
return 1
return n * def(n-1)
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。
由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
当使用 a(1000)时,栈就会溢出而报错,如此我们可以通过尾递归来优化:
def b(n):
return c(n, 1)
def c(n, s)
if n == 1
return s
return c(n-1, n*s)
尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)
函数改成尾递归方式,也会导致栈溢出。
递归函数的栈溢出是避免不了的