深入浅出现代 JavaScript—递归 (1)

260 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

作为一名程序员,无论你是否接触过算法,或者特意去学习过算法,估计你都会无意识接触过递归,递归在编程中应用场景比较多,特别对于一些任务,简单使用递归都可以得到解决。

不过递归看似简单,不过想要熟练掌握递归其实并非易事。其实递归大家都应该看得懂,不过什么时候使用递归,以及如何写递归可能是大家的挠头的痛点。

递归的定义

在力扣(leetCode)中对递归定义是通过定义可以调用自己的函数来解决问题。

递归适合什么样任务

什么样问题可以用递归来解决,通常是一个可以分解为许多小问题的大问题,可以用递归方式来解决。小问题和大问题具有相似性,可能仅是调用函数时参数不同而已。

我们通过对某一个 n 求其 m 次方的任务,来展开介绍递归,

function pow(x, n) { 
    if (n == 1) { 
        return x; 
    } 
    else { 
        return x * pow(x, n - 1); 
    } 
} 
console.log( pow(2, 3) ); // 8

递归的一般解题套路

  • 首先我们要看什么是问题最简单步骤,也就是这个问题最基础也就是最简单输入是什么呢,只要一步就可以解决,对于 pow 函数来说最简单情况就是 n==1 直接返回 x
  • 尝试用图形可视化一层一层问题来找到层与层之间关系

003.png

蓝色表示在上一次结果,每一次我们都是基于上一次结果进行运算,我们可以用 x * pow(x, n - 1) 表示 pow(x, n)。也就是找到 n 和 n-1 之间的关系。

递归与迭代

通常可以用递归解决方法,大家也可以用迭代方式来实现

其实递归就有点类似于循环,是通过函数体来实现递归。在汇编语言中并没有循环语句,需要不断跳到一个函数体反复执行直到不满足一定条件不再实行函数来实现循环体。

  • 递归是逐层,一层层调用函数体自身,同时还需要改变状态

递归组成部分

  • 递归终止条件
  • 递归关系,也就是
function pow(a,b){
    if(b===1){
        return a;
    }else{
        return a * pwo(a,b-1)
    }
}

console.log(pwo(2,5))