笔记内容:狂神说Java阶段一Java基础视频P50
狂神说Java视频链接
目录
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
,这时候代码就清楚了,没啥需要进一步拆解的了,可以轻轻松松一口气计算出来。
所以所谓递归递归,就是不停拆括号这样一个层层叠叠拆解方法的过程。
图解如下: