美文网首页
递归调用

递归调用

作者: Doctor_Xu | 来源:发表于2020-03-26 01:12 被阅读0次

    什么是递归调用

    递归调用就是在本函数中连续不断地对自身函数进行调用。

    递归调用注意点

    1. 递归调用函数要有明确的某一或某些状态让函数返回,递归调用如果不能返回,则会导致Java虚拟机栈内存溢出。
    2. 递归调用本身的层次不能过深,如果层次过深,也会导致上面的问题。

    函数调用

    函数调用要用到程序计数器,程序计数器的作用是:标识虚拟机执行指令的行号指示器,简单理解为:它就是一个数字,标识程序指令执行到了哪一个位置。
    Java虚拟机栈是线程私有的,当进行函数调用时,都会伴随着一个栈帧的创建,并且会创建局部变量表,操作数等数据结构信息,并且会保存当前函数的入口地址信息,以便函数返回时使用。
    所以当函数调用时,虚拟机会保存当前函数的状态,创建栈帧,压入Java虚拟机栈,此时被调用函数处于虚拟机栈的栈顶,所以执行被调用函数,被调用函数执行结束后返回,此时被调用函数的栈帧出栈,程序返回到当前函数执行的地方继续执行。

    递归调用

    递归调用就是重复进行自身函数的函数调用,大致流程如下:

    1. 开始调用
    2. 计算并依据自己希望的结果判断此次调用是否需要返回
    3. 如果要返回,把结果返回给调用者,其实也是本函数,则递归调用的层次或是虚拟机栈的深度减1
    4. 如果不返回,则会继续执行第1步的操作
    5. 直到递归调用最终都返回,也即虚拟机栈中本函数的栈帧全部被弹出,此时递归调用正式结束。

    小结

    理论上来讲,递归调用和其他的函数调用是一样的,对于Java虚拟机栈来说也是一样的,处理方式都是一样的,唯一的区别就是如果不使用递归调用,虚拟机栈中的栈帧数量是可控的,不会无限制增长,因为程序和处理流程都是由程序员设计好的。但是如果递归调用函数出现问题,函数不能返回的话,会导致持续永久递归下去,很快会就会内存溢出,所以使用递归函数时一定要注意程序的边界条件或是返回条件,这也是很多老程序员不太认可递归的原因。
    不过递归函数也并不是一无是处,它的很明显的优势是函数实现简单,代码量少,Android源码程序中也有很多递归函数的使用,例如解析布局文件,View的测量等。个人认为很大一部分原因是:不会有人主动无限制地增加布局文件的层次,用户设计的复杂的UI层次完全可递归调用的可控范围内。

    相关文章

      网友评论

          本文标题:递归调用

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