递归算法,保姆式教学

230 阅读3分钟

JavaScript递归算法是指在编程中使用函数调用自身来解决问题的一种方法。当一个函数调用自身时,这个过程被称为递归调用。在JavaScript中,可以使用递归算法来解决许多问题,例如计算阶乘、斐波那契数列等。

接下来我们用大厂考点深度解析一下递归算法:

给一个多维数组var arr = [1,[2,[3,4]]] 如何把这个数组扁平化(变成一维),简单的思考我们可以用for循环遍历数组,通过判断是不是数组来决定是否把它放到一个空数组里面,代码如下:


var arr = [1,[2,[3,4]]]  //arr只有两个元素叫多维数组
 for(var i=0 ;i<arr.length;i++){
     let res=[]
     if(!Array.isArray(arr[i])){//判断一个值是不是数组
          res.push(arr[i])
     }else{//是数组
         let item = arr[i]
         for(var j=0 ;i<item.length;j++){
             if(!Array.isArray(item[j])){//判断一个值是不是数组
                 res.push(item[j])
            }else{

            }
         }
     }
 }

但是很明显,如果用for循环在不知道数组维度的情况下会很麻烦,所以我们得另外想办法。

flat()函数

var newArr = arr.flat(2) 将数组扁平化,扁平化2次。 (Infinity)表示无穷大,用这个不论几维数组都会变成一维。这是一个函数方法,但是如果我们不使用它能用什么方法?答案是递归

递归

var arr = [1,[2,[3,4]]]
function flaten(arr){
    let res= []
   for(let i= 0;i<arr.length;i++){
    
    if(Array.isArray(arr[i])){
     let newArr= flaten(arr[i])  //递归   一个函数栈堆了很多函数执行,条件结束后要回去执行堆起来的函数
     res=res.concat(newArr)//在执行上面递归时这段代码不会执行,每次都会创建一个新的res回来的时候把数组拼接起来
    }else{
        res.push(arr[i])
    }
   }
   return res
}
flaten(arr)
console.log(flaten(arr));

(递) let res= []放在函数体内每次执行第七行代码都会有一个新的res[]被创建,每执行一次第七行代码就会有函数堆在函数栈(第一次会创建res=[1],第二次是[2])。
(归) 当第四行循环结束后就会回去执行堆在函数栈的函数,这时候第8行代码就会执行,把所有数组拼接起来,最后返回拼接好的数组

5!

求5!有两种方法:

function mul(n){
     let res=1  
     for(var i=1;i<=n;i++){
         res = res*i
     }
    return res 
   //要当心爆栈
      
}
mul(5)
console.log(mul(5));

第一种简单,那么用递归:

function mul(n){
     if(n==1){return 1}//当代码执行到n=1就会返回一个1,一层一层回到n=5
     return n*mul(n-1) //5*mul(4)
}
mul(5)
console.log(mul(5));

mul(5)==5mul(4)
mul(4)==4
mul(3)
mul(3)==3mul(2)
mul(2)==2
mul(1)
mul(1)==1
这是题目的思路,当最后运行到mul(1)==1时,就会原路返回,直到解决mul(5).

斐波那契数列

1 1 2 3 5 8 13 21 34 55 ...
这是一段斐波那契数列的值,请求出第15个斐波那契数列的值

function fb(n){
   if(n==1){return 1}
   if(n==2){return 1}
   return fb(n-1)+fb(n-2)
}
fb(15)
console.log(fb(15));

所以你学会递归了吗?
总结一下,递归就是找规律,找出口,找到了就解决了。