一、递归函数是什么
简介的来说就是函数内部调用自己
二、递归函数需要返回值吗?
<script>
function fn(){
fn()
}
fn()
</script>
执行顺序如下:
程序会不断的进行循环,从而会产生一种现象:死递归,在浏览器运行会报错:01.html:12 Uncaught RangeError: Maximum call stack size exceeded(超出最大调用堆栈的尺寸)
因此递归必须得有一个返回值,那是使用break还是return呢?
break是只用于循环与分支语句中不能够直接使用在程序中。
因此需要使用return,return后面的语句将不会执行,进行返回的操作
三、递归函数运行过程
利用案例:利用递归改写阶乘来说明一下
function diGui(n){
//如果值是等于1的那么就返回它的值
if(n==1){
//到最后一个的时候就会返回它自己的值
return 1
}else{
//不断的调用diGui进行计算n=3,2,1的值直到为1的时候调用n==1,
//然后再把底部的值进行往上放回
return diGui(n-1)*n
}
}
console.log(diGui(4))
执行步骤:
n的取值 执行过程
n=4 1. 4*diGui(3) 6. 4*3*2*1
n=3 2. 3*diGui(2) 5. 3*2*1
n=2 3. 2*diGui(1) 4. diGui(1)=1 2*1
执行的结果:
四、递归函数与循环之间的关系
100%的循环可以用递归函数来实现
90%的递归可以改成循环
哪些程序是循环做不了的呢?
eg:斐波拉切数列
1 1 2 3 5 8 13… ,从第三项开始,后面的一项是前两项的和
function fb(n){
if(n==1){
return 1
}else if(n==2){
return 1
}else{
return fb(n-2)+fb(n-1)
}
}
console.log(fb(10))
运行结果:
这种的就无法使用循环来实现,可以使用递归函数来实现。
五、递归函数的优缺点
根据上述可以得出递归函数的 优点:解决循环解决不了的问题。
缺点:非常消耗内存的空间,因为执行的次数比较多,同样的方式 比循环要多出一倍
总结
递归函数还是有很多奥秘的哦