美文网首页
递归调用太深,可能导致栈溢出

递归调用太深,可能导致栈溢出

作者: test_java | 来源:发表于2019-05-09 08:34 被阅读0次

栈溢出原因:
因为每调用一个方法就会在栈上创建一个栈帧,方法调用结束后就会弹出该栈帧,而栈的大小不是无限的,所以递归调用次数过多的话就会导致栈溢出。而递归调用的特点是每递归一次,就要创建一个新的栈帧,而且还要保留之前的环境(栈帧),直到遇到结束条件。所以递归调用一定要明确好结束条件,不要出现死循环,而且要避免栈太深。
解决方法:

  1. 简单粗暴,不要使用递归,使用循环替代。缺点:代码逻辑不够清晰;
  2. 限制递归次数;
  3. 使用尾递归,尾递归是指在方法返回时只调用自己本身,且不能包含表达式。编译器或解释器会把尾递归做优化,使递归方法不论调用多少次,都只占用一个栈帧,所以不会出现栈溢出。然鹅,Java没有尾递归优化。

当遇到递归时,可能出现栈空间不足,出现栈溢出,再申请资源扩大栈空间,如果空间还是不足会出现内存溢出oom。
合理的设置栈空间大小;
写递归方法注意判断层次;
能用递归的地方大多数能改写成非递归方式。

相关文章

  • 递归调用太深,可能导致栈溢出

    栈溢出原因:因为每调用一个方法就会在栈上创建一个栈帧,方法调用结束后就会弹出该栈帧,而栈的大小不是无限的,所以递归...

  • 从尾到头打印链表

    单向链表的节点定义 栈实现 递归实现 当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出...

  • NO.44 递归

    递归:方法自己调用自己 递归的弊端:不能调用次数过多,容易导致栈内存溢出 递归的好处:不用知道循环的次数 构造方法...

  • 递归&尾递归

    调用栈的特点,先进后出, FILO, 场景还原。 递归 有栈溢出的可能 stack overflow 尾递归 编译...

  • JVM_JMM: StackOverFlow栈溢出

    使用递归演示,自己调用自己导致栈空间溢出,递归和回溯。源代码:MyTest3.java 通过设置VMOption:...

  • 面试题6:从尾到头打印链表

    思路一:用栈 思路二:递归如果链表太长,会导致递归层数过多,可能会溢出

  • 算法--策略-递归

    函数直接或间接调用自身 函数的调用过程 如果递归调用没有终止, 将会一直消耗栈空间, 最终导致栈溢出 所以必须有一...

  • 记一次Kotlin tailrec,lambda 作为入参遇到的

    起因是这周又轮到我组内分享,因为上次分享了 lambda 演算,这次就想接着说下,递归可能导致的问题(调用栈溢出)...

  • 33 递归

    递归不用说了,自身调用自身,递归层数不能太多,要设置截止条件,否则会导致栈内存溢出 构造方法是禁止递归的 如上,方...

  • 排序——快排/归并(nlgn)

    快速排序一般是递归实现,但是递归有一个问题就是如果递归太深会导致栈溢出,而大部分的递归实现都有对应的非递归解决方案...

网友评论

      本文标题:递归调用太深,可能导致栈溢出

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