什么是递归
递归,就是在运行的过程中调用自己。简而言之,递归就是函数自己调用自己
浅显易懂的例子
- 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢?从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢?…
递归的优缺点
优点
- 相对于迭代算法而言,结构更清晰、更简洁、更容易让人从宏观上理解程序的整体结构。
- 容易使用数学归纳法证明算法的正确性。
缺点
- 由于递归是函数调用函数本身,造成了1+1>2的情况,所以资源占用比其他调用高很多
- 遇到确实复杂的问题,递归可能比正常写更加难理解
最简单的递归
function add(num){
if(num==2){
return num //如果num==2,返回这个函数
}else{
return num * add(num-2);
}
}
var re = add(10);
//斐波那契数列
function fib(n){
if(n==0||n==1){
return 1
} else{
return fib(n-1)+fib(n-2);
}
}
alert(fib(47))
//犹豫递归的缺点,在计算斐波那契数列时占用资源多的多,所以不推荐使用
递归的实际应用
深拷贝
var obj = {
name:"liuxingyu",
age:18,
friend:["A","B","C"],
say:function(){alert( this.name)}
}
正常深拷贝只能深拷贝利用
值类型,与引用类型都拷贝(互相不影响)
对象转字符JSON.stringify,字符串转json JSON.parse()
JSON数据格式只支持:string,number,null,undefined,array,object
//正常简易深拷贝
var obj1 = JSON.parse(JSON.stringify(obj))
有了递归,就可以对是JSON数据格式支持的对象进行简易拷贝
然后对不支持的(函数,正则等)进行递归拷贝
function deepCopy(obj){
// 如果typeof 值是object并且不是null
if(typeof obj=== 'object'&&obj!=null){
var result;
// 如果是数组
if(obj instanceof Array){
result = [];
// 遍历数组,执行拷贝
for(var i=0;i<obj.length;i++){
// 当前下标的值是执行深拷贝的结果
result[i]=deepCopy(obj[i])
}
}else{
// 如果是对象
result = {};
for(var k in obj){
// 执行遍历深拷贝对象
result[k] = deepCopy(obj[k])
}
}
// 返回的结果
return result;
}else{
// 值类型或者null或者 函数直接返回
return obj;
}
}