举个例子:
从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“太困了不讲了”,于是都回去睡觉了。”于是都回去睡觉了。”于是都回去睡觉了。”于是都回去睡觉了。
我用不同颜色标记处来了每一层的对应关系,
很明显地看出颜色从头开始往中间逐渐变化,然后到一定程度(我们称之为递归的边界或是结束条件)就从内二外的层层返回。——这就是递归
类似于剥洋葱,一层套着一层,直到掰到最里层。
递归,就是在运行的过程中调用自己。
就比如假设我们现在都不知道什么是递归,我们自然想到打开浏览器:输入到谷歌的网页,点击搜索递归,然后在为维基百科中了解到了递归的基本定义。在了解到了递归实际上是和栈有关的时候,你又蒙圈了,什么是栈呢?数据结构没学清楚,此时的你只能又打开谷歌,搜索什么是栈。接下来你依次了解了内存/操作系统。在你基本了解好知识之后,你通过操作系统了解了内存,通过内存了解了栈,通过栈了解了什么是递归这下你恍然大悟!原来这就是递归啊!
递归的基本思想是某个函数直接或者间接地调用自身,这样原问题的求解就转换为了许多性质相同但是规模更小的子问题。求解时只需要关注如何把原问题划分成符合条件的子问题,而不需要过分关注这个子问题是如何被解决的。
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
举例:
计算N的阶乘
- public static void main(String[] args) {
- int n=6;
- int c=f(n);
- System.out.println(c);
-
- }
-
- public static int f(int n){
- if(n==1)
- return 1;
- return n*f(n-1);
- }

在程序执行中,递归是利用堆栈来实现的。每当进入一个函数调用,栈就会增加一层栈帧,每次函数返回,栈就会减少一层栈帧。而栈不是无限大的,当递归层数过多时,就会造成 栈溢出 的后果。
递归 是以空间换取时间
循环 是以时间换取空间(能用循环的地方 别用递归)
当一个问题可以划分为若干类似的子问题,而子问题也可再划分时就可以用递归。比如杨辉三角、计算阶乘
1.找重复:
找到递推公式或者等价转换 这些都是父问题转化为求解子问题
2.找变化的量:变化的通常要作为参数
3.找出口
