起源
一直感觉递归蛮绕,所以想学习下
例子
查看资料,大部分讲递归都用到斐波那契数列,那我也用这个例子吧,公式是F(n) = F(n-1) + F(n-2)
树图
解释
执行流程
如图所示,这是整个执行流程,每一个结点头上都有一个数字代表是第几次调用F函数,聪明的小伙伴已经看出来这个是二叉树的先序遍历(根,左,右),不难看出,只有在叶子节点(没有子节点的节点)上才返回值,也就是F(0)和F(1),返回了5个F(1)和3个F(0),所以结果是5,
返回流程
那么具体是怎么返回的呢,当执行到第5个节点时 F(1)返回了1,然后等待第6个节点F(0)一起做运算
F(1) + F(0),并且返回给F(2), 那么此时第四个F(2)节点已经有值了,但是他并不能返回,因为他要等第7个节点的值 一起做公式运算 F(2)+F(1),其他节点依次类推,然后一直到返回到根节点F(5)
代码演示
代码
public class Test3 {
// F()函数一共执行的次数,和上面的树节点个数对应
static int count = 0;
public static void main(String[] args) {
F(5);
System.out.println("一共执行F()次数:" + count);
}
public static int F(int n) {
count++;
System.out.println("进来的是===" + n);
/*
* 小于0是为了 避免初始 n 为负数
* 等于0是为了考虑边界情况
* */
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
return F(n - 1) + F(n - 2);
}
}
结果
总结
递归函数一般分成两个部分,一个是边界处理,一个是公式,边界处理就是 那些对应的返回具体值的部分,对应上面的是两个if语句,公式就是两个数之间存在什么关系,用一个公式表示出来,然后如上面的树图所示,一直先序遍历到叶子节点,然后才返回值,最后所有叶子节点返回的总和(这个例子是总和,其他的如阶乘就不是了,总之就是叶子节点做一些运算返回给各自的根节点,然后一直返回到根节点)就是要求的F(n)。