关于递归函数的栈溢出

一般的递归函数:

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)函数改成尾递归方式,也会导致栈溢出。

 

递归函数的栈溢出是避免不了的

posted @ 2017-10-14 11:37  不乱来的嫖客  阅读(639)  评论(0编辑  收藏  举报