- 递归算法是一种直接或者间接调用自身函数或者方法的算法
- 递归就是方法里调用自身。
- 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
- 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
- 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
我们看一个求N的阶乘的示例
function factorial(n){
if(index == 1) return 1;
else return factorial(n - 1) * n;
}
执行过程大概是这样
画个流程图
有什么优化方法么?
/*
* 可以使用闭包处理
*/
function factorial(n){
let sum = 1
const func = i => {
if(i == 1) sum *= i
else {
sum *= i
func(i-1)
}
}
func(n)
return sum
}
尾递归
- 尾调用,是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数
function factorial(n, sum = 1){
console.log('index', n, 'sum*n', sum * n)
return n == 1 ? sum * 1 : factorial(n - 1, n * sum)
}
看一下执行顺序