一、什么是递归
递归就是函数内部调用自身函数
递归本质上就是循环,但是相比循环来讲,更加的灵活,可以根据需求,传入想要的数据或内容
function func(){
console.log("123456787654");
func(); // 递归
}
func();
以上代码实例为一个并不完整的递归,有瑕疵,上面有提到过递归的本质上是循环,func函数调用自身函数可以看作为循环体,那么循环判定的条件表达式好像以上代码实例并没有,所以这个递归函数会一直执行打印123456787654;
所以在使用递归时,一定要存在退出条件!!!
二、递归的经典案例
光说不练假把式,直接上一个小小的案例:使用递归算出5的阶乘
function mul(n){
if(n == 1){
return 1
}else{
return n * mul(n - 1)
}
}
console.log(mul(5)) // 120
在数学中5的阶乘为 1 * 2 * 3 * 4 * 5 = 120;
我们可以用递归来写,因为递归是函数内部调用自身函数,所以需要用函数来包一层,再调用次此函数,又因为递归本质上就是循环,所以递归一定存在相当于循环判定的条件表达式一样的退出条件,以上实例当形参n为1的时候,递归结束
阶乘案例都出来了,那必少不了斐波那契案例
function dg(n){
if(n <= 2){
return 1
}else{
return dg(n - 1) + dg(n - 2)
}
}
console.log(dg(10))
浅浅的分析一下,斐波拉契的规律是任取连续的三个数,前两个数相加等于第三个数。某项等于前两项的和;以上实例参数n是当前数,那么规律就出来了n的前一位加上n的前两位就是第n位的斐波拉契数,而斐波拉契的最前的两位都是1,所以退出条件也出来了,第n位的斐波那契就出来了,这不简简单单
三、递归的经典应用场景
有哪些问题我们可以考虑使用递归来解决呢?即递归的应用场景一般有哪些呢?
- 阶乘问题
- 二叉树深度
- 汉诺塔问题
- 斐波那契数列
- 快速排序、归并排序(分治算法也使用递归实现)
- 遍历文件,解析xml文件
四、递归的优缺点
可以一句话总结递归的优缺点:根据公式是人能够看懂的点是递归的唯一优点,其他的全是递归的缺点