对递归的简单认识
1.递归简单认识
递归解决问题就是把大问题变成小问题。函数之间的循环调用。
2.递归的里面问题
方法自己调用自己,最重要可能是递归的结束调节,因为每一个方法的执行都会产生一个栈,然而栈是有大小的,如果无限递归就会产生stackOverofMemeory(栈溢出),并且每一个方法都有自己的私有变量。而且每一次的方法调用都会产生一个栈帧,也会随着方法的结束而销毁。
栈帧的基本概念:本地变量表,操作数栈,动态链接,方法返回地址
本地变量表:是一个数组类型,主要储存基本变量(byte,boolean等),引用地址,方法返回值,那么数组里面的一个变量占用4个字节,然而long,double类型呢,当然占用8个字节。
操作数栈:是一个后进先出栈结构,主要是进行算数运算和方法里面的参数传值。
动态链接:栈帧指向常量池的引用。
方法返回地址:方法的返回值有两种情况,一种是异常情况,方法没有返回值,不会处理异常,另一种是正常情况,返回给调用者正常值。
3.递归里面的运行过程
运行结果:
分析:我们可以看出求阶乘是递归里面比较简单的例子,但是下面的快速排序法里面使用递归算法,如果我们在不看运行结果,写出里面的运行结果,说明我们对递归有了自己的认识。
这里面我们至于要把握住两点,一个是递归的结束条件。每一个方法都有自己的私有变量。
递归的缺点:
1.递归的调用就是函数自己调用,当它自己调用自己时,会在栈中重新分配空间,还有需要入栈和出栈有需要花费时间
2.递归如果大于栈的分配的内存空间,会产生栈溢出的危险。
3.方便了程序员,难为了机器。可能二叉树的前中后序用递归很容易实现,但是不用递归许多人估计很虚。