利用斐波拉契数列理解递归
递归是啥,你可以去谷歌一下,没有解答,你就会一直循环下去,直到你了解了递归是啥,这便是递归,哈哈哈哈哈,我自己都不相信自己说的自己能不能理解,怎么来和你们讲呢,好的,就让我们直接用实例去理解递归吧
可以看看这个视频先,形象了解下
斐波拉契数列
什么是斐波拉契数列,如下数字所示
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),如下图所示
最后我们来到了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 | let fac = function(n) { |
在哪里使用递归,你可以按以下三点进行分析
你想完成一个怎样的功能
斐波拉契数列
终止条件
1
找出关系式
fac(n-1) + fac(n-2)
阶乘
接下来就让我们用递归解决阶乘的代码编写问题,按以下三点进行
你想完成一个怎样的功能
当我给一个数字n时,计算出n以及n-1,n-2直到1时相乘的值
终止条件
1
找出关系式
n * f(n-1)
开始编写代码
定义一个函数
1 | let jie = function (n) { |
编写终止条件
1 | if(n == 1) { |
计算关系式
1 | return n * jie(n-1) |
完整代码
1 | let jie = function (n) { |
这便是我所理解的递归,与循环不同,循环是按照一个规律一直进行下去,直到终止条件发生,便停止循环,简单来说,即有去无回。而递归便是有去有回,就是从哪里开始,就从哪里结束。