递归
递归就是一个函数直接或间接的调用自己.一般来说,递归需要有边界条件,递归前进段和递归返回段.当边界条件不满足的时,递归前进,当边界条件满足的时候,递归返回. 递归就是在过程或者函数里调用自身. 在使用递归策略时.必须有一个明确的递归结束条件,称为递归出口.
- 递归一般用来解决三类问题:
- 数据的定义是按照递归定义的(Fibonacci函数,n的阶乘)
- 问题解法按递归实现(回溯)
- 数据的结构形式是按照递归定义的.(二叉树的遍历,图的搜索)
- 递归的缺点: 递归解题相对常用的算法如普通循环等,运行效率较低(所有的循环问题都可以用递归来解决).在递归调用的过程当中系统为每一层的返回点,局部变量等开辟了栈来存储,因此递归次数过多容易造成栈溢出.
var f = function (x) {
if (x < 2) return 1; //递归终止条件
else return x * f(x - 1); //递归调用过程
}
console.log(f(5)); //返回5的阶乘值为120
尾递归
尾递归是递归的一种优化算法,递归函数执行时会形成一个调用函数,当子一层的函数代码执行完成之后,父一层的函数才会销毁调用记录,这样就形成了调用栈,栈的叠加可能会产生内存溢出。而尾递归函数的每子一层函数不再需要使用父一层的函数执行完毕就会销毁栈记录,避免了内存溢出,节省了内存空间。
function f (n, a) {
return (n == 1) ? a : f (n - 1, a * n);
}
console.log(f(5, 1)); //120