javascript
先说一下概念,递归就是直接或间接的调用自己,递归就是将没解决的问题转化为已解决的问题。
所以重点是转化过程, 即递归( 划归 )过程, 然后就是在某个条件下已解决的内容。
递归可分为直接调用,以及间接调用。
直接调用
function func() {
func(); // 递归了
// ...
}
间接调用
function func1 () {
func2();
}
// 在func1 中调用 func2
function func2 () {
func1();
}
// 在func2中调用 func1
下面展示几个小案例
1. 斐波拉切数列
1 1 2 3 5 8 13
function f(n) {
// 当n等于1或者二时 都为1终止递归
if (n === 1 || n === 2) {
return 1;
}
return f(n - 1) + f(n - 2);
}
2. 对象的克隆 深克隆和浅克隆
输入两个参数,第一个为要clone的对象,第二个决定是否要深克隆
function clone(obj, deep) {
// 判断obj的数据类型
if (Array.isArray(obj)) {
// 是否进行深度克隆
if (deep) {
// 进行深度克隆
var newArr = [];
for (var i = 0; i < obj.length; i++) {
// 在克隆数据之前 判断是否是引用类型
newArr.push(clone(obj[i], deep));
}
// 深度克隆之后返回数据
return newArr;
} else {
// 浅度克隆
return obj.slice();
}
// 判断是否是对象
} else if (obj.toString() === '[object Object]') {
var newObj = {};
// 遍历对象
for (var prop in obj) {
// 是否要对对象进行深度克隆
if (deep) {
// 进行递归调用 判断当前属性是否是引用类型
newObj[prop] = clone(obj[prop], deep);
} else {
// 对象浅克隆
newObj[prop] = obj[prop];
}
}
return newObj;
} else {
// 函数 原始类型
return obj;
}
}
效果如下