递归是啥,你可以去谷歌一下,没有解答,你就会一直循环下去,直到你了解了递归是啥,这便是递归,哈哈哈哈哈,我自己都不相信自己说的自己能不能理解,怎么来和你们讲呢,好的,就让我们直接用实例去理解递归吧

可以看看这个视频先,形象了解下

斐波拉契数列

什么是斐波拉契数列,如下数字所示

1、1、2、3、5、8、13、21、34、55、…

看到规律了有没有,从第三个开始,他的值总会等于它前两个值相加,像这样→f(n - 1) + f(n - 2)(n >= 3),好的,目前看起来这个原理很容易理解,让我们来点难的,现在我直接问你,当n = 11时,对应的斐波拉契数是多少,啊这这这这,让我拿出一张纸先,好的你开始了推演,计算第11的斐波拉契数,它等于第10的斐波拉契数加第9的斐波拉契数,第10的斐波拉契数是啥,是第9+第8的斐波拉契数…..最终我们来到了1,所以我需要从1开始算起,算到第11个数:继续1,然后1+1,然后(1+1)+1,接着((1+1)+1)+(1+1),如下图所示

image-20210311212046966

最后我们来到了11这边,答案出来啦,就是89,这便是递归的过程,从哪里开始,从哪里结束,中间经历着一堆同样规则的计算

用网上的一个例子:你用你手中的钥匙(f(n - 1) + f(n - 2))打开一扇门(n = 11),结果去发现前方还有一扇门(n=10),紧接着你又用钥匙打开了这扇门,然后你又看到一扇门(n=9),…,当你开到某扇门时(n = 2),发现前方是一堵墙(f(n) = 1(n = 1、2))无路可走了,你选择原路返回((((((1+1)+1)+1)+1)+1)…),最后返回最开始的门(n = 11)。

钥匙便是这个过程的规律(通用的关系式),第一个门就是你所需要求的值的索引,开过一个又一个需要相同钥匙开的门,墙便是终止条件,然后重新回去你就知道了你所求的值是什么,这便是整个过程了,这也就是递归

也可以通过下面的代码理解

1
2
3
4
5
6
7
8
9
10
let fac = function(n) {
if(n == 1 || n == 2) {
return 1
}else {
return fac(n-1) + fac(n-2)
}
}

//计算斐波拉契数
console.log(fac(8))

在哪里使用递归,你可以按以下三点进行分析

  1. 你想完成一个怎样的功能

    斐波拉契数列

  2. 终止条件

    1

  3. 找出关系式

    fac(n-1) + fac(n-2)

阶乘

接下来就让我们用递归解决阶乘的代码编写问题,按以下三点进行

  1. 你想完成一个怎样的功能

    当我给一个数字n时,计算出n以及n-1,n-2直到1时相乘的值

  2. 终止条件

    1

  3. 找出关系式

    n * f(n-1)

开始编写代码

定义一个函数

1
2
3
let jie = function (n) {

}

编写终止条件

1
2
3
if(n == 1) {
return 1
}

计算关系式

1
return n * jie(n-1)

完整代码

1
2
3
4
5
6
7
let jie = function (n) {
if(n == 1) {
return 1
} else {
return jie(n-1) * n
}
}

这便是我所理解的递归,与循环不同,循环是按照一个规律一直进行下去,直到终止条件发生,便停止循环,简单来说,即有去无回。而递归便是有去有回,就是从哪里开始,就从哪里结束。