玩了一个月,好久没打代码了,有点面生,遇到一道递归题目不会做,来分析一下递归函数
递归函数:说白了就是自己调用自己。
自调
function mine () {
mine ();
console.log("我在调用自己!") //别瞎试,没有终止条件,变成死循环,浏览器会爆炸!
}
mine();
变量 + 函数
// 一个简单的累加函数
var add = function (x) {
if (x == 1) {
return 1;
} else {
return x + add(x - 1);
}
};
console.log(add(5));// 1 + 2 + 3 + 4 + 5 = 15
分析一波,为什么要返回 x + add(x - 1)?
看咱们题目是累加,累加什么意思,就是 1 + 2 + 3 + ... + n
所以我们求5的累加,是不是可以变成 5 + (5 - 1) 变成 n 的累加的话,就是 n + ( n - 1 )
所以就得出为什么返回 x + add(x - 1)
同样,我们思考一下阶乘,n的阶乘 n! = 1 * 2 * 3 * ... * n
可以得出 n * (n - 1)
两个一对比,一看就明白了,这不是就是我们初中/高中数学学的找规律的题目么!
后端用递归函数比较多,所以对于后端的开发人员来说,递归小菜一碟,不值得说。
但对于我们前端,特别是刚入门的前端来说,这个就不是很了解,
所以有时候遇到复杂的递归函数就一面懵逼(what fuck !这写的什么鬼代码!),
因此先从简单的累加函数分析一下递归函数的运行过程!
运行过程
//首先执行函数 add(5)
x=1 / \ x!=1
//然后判断运行 返回 1 返回 5 + add(4)
\ |
4 + add(3)
\ |
3 + add(2)
\ |
2 + add(1)
\ |
1 + add(0)
//执行add(0)就报错了
//所以结果就是 5 + 4 + 3 + 2 + 1 = 15
说完上面简单的,再来一个复杂点的递归。
函数 + 函数
//经典斐波拉契题目,求数列中的第20项,1,1,2,3,5,8,13,......
//按上面思路,我们找下规律,
//可以发现,从第3项开始,
//前面1位 + 前面2位 = 当前数列的值
//也就是说,当我求第3项的值时 第3项 = 第2项 + 第1项
//若我求第n项的值得时候 第n项 = 第n-1项 + 第n-2项
//ok,我们开始写代码
function num (n) {
if (n == 1 || n == 2) return 1;
return num(n-1) + num(n-2);
}
console.log(num(20))
我们自己写下运行过程,看看对不对
运行过程
//我取n = 5,看结果是不是等于 5
//以下内容 num(n) 我就直接写(n)了
num(5)
/ \
(4) (3)
/ \ / \
(3) (2) (2) (1)
/ \ | | |
(2) (1) 1 1 1
| |
1 1
//树形图中间不用看,我们将每条支线最后的形参取出来
//得到(2) (1) (2) (2) (1)
//形参为1或2时返回1,用 + 连接起来
//得到 1 + 1 + 1 + 1 + 1 = 5
//所以我们找的规律没错!
看完这个过程,再按找规律的思路,去做递归编程题目时,妈妈再也不用担心我不知道return后面接什么东西了!