【狂神说Java学习笔记】阶段一JavaSE基础(七)递归

笔记内容:狂神说Java阶段一Java基础视频P50
狂神说Java视频链接


目录

1、递归要素
2、递归练习


1、递归要素

  • 递归:什么时候不调用自身方法。如果没有头,将陷入死循环。
  • 递归:什么时候需要调用自身方法
test.test();		//main中调用

public void test(){	//没有头会报错,栈溢出
      if(...){return...}      //递归头
      test();                 //递归体
}

2、递归练习

计算5!

//main
public static out println(f(5));

//f(n)方法
public static int f(int n) {
        if (n == 1) {      //因为1没有办法再减1了,否则乘出来的结果是0,所以要作为单独的情况考虑
            return 1;
        }else {
            return n*f(n-1);
        }
    }

>>>
120

对于代码的理解:
我最开始学递归的时候,总觉得是每一次计算出当下的数,再套下一层继续计算。比如先计算出54=20,再用203,以此类推。但实际上递归是先层层调用函数,把所有的函数都映射为具体数值再做运算。

比如在这里,代码运行到rerurn n*f(n-1);这句话,会先变成return 5*f(5-1),结果代码发现f(4)挡在这里不知道什么东西,没法计算,它就会继续去调用f(4),变成return 5*4*f(4-1),……,一直把所有括号都拆开,写成return 5*4*3*2*1,这时候代码就清楚了,没啥需要进一步拆解的了,可以轻轻松松一口气计算出来。

所以所谓递归递归,就是不停拆括号这样一个层层叠叠拆解方法的过程。

图解如下:

原文地址:https://www.cnblogs.com/lanlynn/p/13473785.html