美文网首页
python 递归函数 栈溢出

python 递归函数 栈溢出

作者: kevin282 | 来源:发表于2017-03-01 11:25 被阅读604次

题目:

计算阶乘n!=n*(n-1)*(n-2)*…3*2*1

用递归函数来表示为:

def f(x):

   if x==1:

       return 1

   return x*f(x-1)

代码截图 运行结果

计算5的阶乘5!,运行正确。

接着计算大一点的数1000!:

代码截图 运行结果 运行结果

可以看到运行结果报错了,这是因为出现了栈溢出。

在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

在计算1000!时,递归函数使得函数调用次数非常多,层级很深,返回却很少,导致堆栈无法容纳大量的调用返回地址,从而产生溢出。

解决思路是:

对return语句进行尾递归优化,也就是避免在return语句里出现表达式(上文代码中的‘return x*f(x-1)就是一个乘法表达式’),这样解释器或编译器就会自动把尾递归进行优化,使得无论递归多少次函数,都只占用一个栈,从而避免溢出的产生(原理上)。

def fact(n):

    return fact_iter(n, 1)

def fact_iter(num, product):

    if num == 1:

        return product

    return fact_iter(num - 1, num * product)

print fact(5)

上文代码是做了尾递归优化的情形,可惜的是python并不支持尾递归优化,python递归的次数在1000以内不会产生溢出,1000以上就要考虑用循环来代替了。

可修改成:

def function(x):

    s = 1

    if x == 1:

        return 1

    if x>1:

        for i in range(1,x+1):

            s = s*i

         return s

    else:

        return 'No Answer!'

print function(5)

代码截图 运行结果

print function(1000)已经可以正常输出了。

案例及学习材料来源:廖雪峰大大的博客

扩展阅读:python老爹拒绝尾递归优化的理由

相关文章

  • python学习4

    学廖雪峰老师的python教程笔记。 1、递归函数 函数内部调用该函数本身,比循环逻辑简单 注意防止栈溢出 尾递归...

  • python 递归函数 栈溢出

    题目: 计算阶乘n!=n*(n-1)*(n-2)*…3*2*1 用递归函数来表示为: def f(x): if ...

  • 9. 递归函数

    使用递归函数需要注意防止栈溢出解决递归调用栈溢出的方法是通过尾递归优化遗憾的是,大多数编程语言没有针对尾递归做优化...

  • 1

    #函数 ##递归函数容易,栈溢出,这个时候可以用*尾递归*优化,尾递归的意思就是说在递归函数末尾引用本函数的时候,...

  • 看完必会的正则表达式和递归

    1,递归 递归函数:一个函数在内部可以调用其本身 递归容易发生栈溢出错误(stack overflow),以上是一...

  • 2018-10-28

    递归函数 标签(空格分隔): 重新理解一遍递归   首先,使用递归函数需要防止栈溢出。因为在计算机中函数的调用是通...

  • Python学习之路(递归函数)

    函数之 递归函数 小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通...

  • java OOM与SOF

    OOM尼玛就是内存不足,SOF就是栈溢出。狂调递归函数就会引起栈溢出,不停申请对象就会导致内存超过上限。

  • 复盘廖大教程时部分遗忘点记录

    递归 使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函...

  • 递归

    递归: 函数直接或间接调用自身,是一种常用的编程技巧 如果递归没有终止条件,将会一直消耗栈空间,最终导致栈内存溢出...

网友评论

      本文标题:python 递归函数 栈溢出

      本文链接:https://www.haomeiwen.com/subject/bxlqgttx.html