一、递归函数:函数内部调用函数自己、有结束的条件
1、求1-100所有数的和
function getSum(n) {
// 一定要有已知的条件
if (n === 1) {
return 1
}
return getSum(n - 1) + n
}
2、求斐波那契数列(兔子数)
普通方法(不推荐,运算次数过多,会严重影响浏览器性能)
unction getFib(n){
if(n === 1 || n === 2){
return 1;
}
return getFib(n - 1) + getFib(n - 2);
}
优化
// 使用数组存起来
// 1. 计算某个月兔子数,先去数组中判断, 是否有这个月对应的数字 ,不需要计算
// 2. 如果没有,说明,这个月是没有算过, 计算即可, 把计算的结果保存下来
var arr = [1, 1]
function getFib(n) {
if (!arr[n]) {
// 计算这个月的兔子数
arr[n] = getFib(n - 1) + getFib(n - 2)
}
return arr[n]
}
console.log(getFib(1000))
二、闭包
闭包是 内部函数访问了外部函数的局部变量,就会发生闭包
闭包的作用:保护私有变量
闭包的问题: 内存不会释放
内存泄漏: 有一块内存,一直被占用了,无法回收, 这块内存泄漏。
js中垃圾回收的工作原理
1. 引用计数(只要有对象被引用,内存就不会释放)
2. 标记清除(从window根对象开始,只要没被window引用就会释放内存)
斐波那契数列闭包优化:
function outer() {
var arr = [1, 1]
function fn(n) {
if (!arr[n]) {
// 计算这个月的兔子数
arr[n] = fn(n - 1) + fn(n - 2)
}
return arr[n]
}
return fn
}
var getFib = outer()
console.log(getFib(11))
getFib = null