js的递归基本使用

可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了!

可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归的捷径啊。说实话,哪来那么多捷径啊,不过,我还是想写一篇文章,谈谈我的一些经验,或许,能够给你带来一些帮助。

为了兼顾初学者,我会从最简单的题讲起!

递归的三大要素

第一要素:明确你这个函数想要干什么

对于递归,我觉得很重要的一个事就是,这个函数的功能是什么,他要完成什么样的一件事,而这个,是完全由你自己来定义的。也就是说,我们先不管函数里面的代码什么,而是要先明白,你这个函数是要用来干什么。

例如,我定义了一个多层数组来求和

const add = (arr) => {
    let result = 0;
    arr.forEach((item,) => {
        if (Array.isArray(item)) {
            result += add(item)
        } else {
            result += item
        }
    })
    return result;
};

const arr = [121, 200, 300, 400, [500, 600, [700, 80, [1, 20]]]]
console.log(add(arr));

第二要素:寻找递归结束条件

所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。

第三要素:找出函数的等价关系式

第三要素就是,我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。

至此,递归三要素已经都写进代码里了,所以这个 f(n) 功能的内部代码我们已经写好了。

这就是递归最重要的三要素,每次做递归的时候,你就强迫自己试着去寻找这三个要素。

还是不懂?没关系,我再按照这个模式讲一些题。

案例1:斐波那契数列

斐波那契数列的是这样一个数列:1、1、2、3、5、8、13、21、34…,即第一项 f(1) = 1,第二项 f(2) = 1…,第 n 项目为 f(n) = f(n-1) + f(n-2)。求第 n 项的值是多少。

 

1、第一递归函数功能

假设 f(n) 的功能是求第 n 项的值,代码如下:

function f(n) {
   
}
f(5)



2、找出递归结束的条件

显然,当 n = 1 或者 n = 2 ,我们可以轻易着知道结果 f(1) = f(2) = 1。所以递归结束条件可以为 n <= 2 时,f(n= = 1。代码如下:

function f(n) {
    if (n <= 2) {
        return 1
    } 
}


第三要素:找出函数的等价关系式

题目已经把等价关系式给我们了,所以我们很容易就能够知道 f(n) = f(n-1) + f(n-2)。我说过,等价关系式是最难找的一个,而这个题目却把关系式给我们了,这也太容易,好吧,我这是为了兼顾几乎零基础的读者。

所以最终代码如下:

function f(n) {
    if (n <= 2) {
        return 1
    } else {
        return f(n - 1) + f(n - 2)
    }
}
console.log(f(5));



搞定,是不是很简单?

 还有一种求children里面的和用递归写的方法是

let arr1 = [
    {
        name: "张三",
        money: 100,
        children: [
            { name: "张欢欢", money: 200 },
            {
                name: "张乐乐",
                money: 100,
                children: [
                    { name: "张小欢", money: 300 },
                    { name: "张小乐", money: 400 },
                ],
            },
        ],
    },
    {
        name: "李四",
        money: 100,
        children: [
            { name: "李红红", money: 500 },
            { name: "李明明", money: 600 },
        ],
    },
];
function fn(arr) {
    let sum = 0
    arr.forEach(item => {
        if (item.children) {
            sum += fn(item.children)
        } else {
            sum += item.money
        }
    })
    return sum
}
console.log(fn(arr1));

零基础的可能还是不大懂,没关系,之后慢慢按照这个模式练习!好吧,有大佬可能在吐槽太简单了。