Javascript中递归函数的原理与应用

递归函数在Js中属于比较抽象,比较难理解的问题,今天我来给大家揭晓一下他的本质和几个小的案例!

1、先来一个图,大家瞧一瞧什么是递归:

                      Javascript中递归函数的原理与应用

       很魔性吧,这个图片很清晰的给我们展示了递归函数的运行流程:从起始条件归到终止条件。

2、如果单纯的以大段文字讲解原理,太过枯燥,我们直接将到应用的例子上,这样反而更加的生动形象。

      第一题:使用函数计算1+2+3...... + n的和?

      我们拿到题目先慢慢分析条件:1.使用函数;2.计算1到n的和;

      如果我们用递归函数写这道题呢?我们就需要知道起始条件和终止条件(防止死递归);

      那两个条件是什么呢?

     我们分析一下,从1加到n,我们不知道n是多少但是我们知道第一位是1啊,所以把n设为起始位,把第一项设为终止条件,当这个函数运行到第一项的时候,将第一项的值1返回给函数即可。

      Javascript中递归函数的原理与应用

我们看一下控制台:Javascript中递归函数的原理与应用;我特意打印了一下sum(2)和sum(3);

第二题:我们直接下猛药:求解n项斐波那锲数列的值?

ps:斐波那锲数列是指:1,1,2,3,5,8,13.....n;  这个数列有个特殊的规律,n项的前两项的和

拿到这个条件我们就好办,这里需要注意了,这个数列前两项的1是固定的,所以我们把前两项设为终止条件,n同样的设为起始条件。

Javascript中递归函数的原理与应用

这里有一个需要理解的地方,这个运算规则是计算的第N项的值,而不是N项的和,

我们写个公式理解下:假设n=3的时候,直接返回的是:N(3)=f(2)+f(1),依次类推第二项的值呢,第一项的值;

大家可能觉得第3项比较特殊,好的,我们来分析第100项,N(100) = f(99)+f(98), 这里只是函数的调用,我怎么拿到f(99)和f(98)的数值呢,所以函数一层一层往下查找,因为有底层第1项和第2项两个1的支撑,当查找到时,函数直接拿过来用,又从底层一层一层的向上返回数据;原理图如下(黑色代表向下查找数据,红色代表向上返回请求的数据)

Javascript中递归函数的原理与应用

这道题我们再拓展一下,如果需要拿到前n项的和呢?

这个更简单了!

Javascript中递归函数的原理与应用

我们直接在外层套个循环,当前的i是什么,函数就返回第i项的值;

下面是输出的结果:

Javascript中递归函数的原理与应用

下面再给大家拓展一道题,如何用递归函数,实现欧几里得算法!

何谓欧几里得算法:求两个数的最大公约数,如  a=10,b=15,最大公约数为5

Javascript中递归函数的原理与应用

大家想不要慌,这什么鬼算法,看着好高大上啊,我还要懂算法吗?老实说不用,我们按照最开始说的,递归函数就是找起始条件和终止条件!

这张图很明显,当  a % b =0就输出,结束了,否则的发继续执行,好的起始条件就是右侧这一坨了。

Javascript中递归函数的原理与应用

输出结果如下:

Javascript中递归函数的原理与应用

递归函数虽然好用,但是他的缺陷也很大,平常我们的工程中基本很少用到,他的性能太差!

下面举个小栗子哦:

Javascript中递归函数的原理与应用

就这么几行代码,浏览器直接假死,所以一定要设置好终止条件,否则就是死循环!

Javascript中递归函数的原理与应用

Javascript中递归函数的原理与应用