美文网首页
递归调用

递归调用

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

什么是递归调用

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

递归调用注意点

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

函数调用

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

递归调用

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

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

小结

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

相关文章

  • 递归调用

    什么是递归调用 递归调用就是在本函数中连续不断地对自身函数进行调用。 递归调用注意点 递归调用函数要有明确的某一或...

  • Python 递归调用与二分法

    递归调用与二分法 1、递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 递归的执行分为两个...

  • [每天进步一点点~] 递归与闭包

    1.递归 【定义】:在自己函数的内部调用自己(自己调用自己) (函数自调用) 。递归函数 简单举例?: 阶乘的递归...

  • 重复

    递归在自己的定义中调用自己的函数叫做递归函数(Recursive Function)。 尾递归普通的递归调用并不高...

  • 函数递归调用

    在函数里调用自己的行为:函数递归调用 递归调用一定要有最后一次递归时的终止条件,如果没有,会导致无限调用,导致调用...

  • 单信js——4难点部分

    递归: 递归函数是指在函数内部调用函数自身。注意:递归的出口:什么情况下结束调用递归的入口:什么情况下调用自已 /...

  • 递归与分治

    递归(Recursion):指函数的定义中调用函数自身的方法。 递归调用过程: 举个很好玩的栗子: 用递归调用输出...

  • 关于原生js-递归

    递归函数---在函数内部间接或直接自己调用自己 递归又分为直接递归或者间接递归 直接递归指在函数中自己调用自己 间...

  • js递归

    递归 递归的概念在程序中函数直接或间接调用自己直接调用自己简介调用自己跳出结构,有了跳出才有结果思想递归的调用,最...

  • Java递归调用—实现自定义四则运算表达式解析/计算

    递归调用 先拷贝一下百科上递归调用的定义啊: 递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后...

网友评论

      本文标题:递归调用

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