关于递归和深拷贝

什么是递归

递归,就是在运行的过程中调用自己。简而言之,递归就是函数自己调用自己

浅显易懂的例子

  1. 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢?从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事。故事是什么呢?…
  2. 在这里插入图片描述

递归的优缺点

优点

  1. 相对于迭代算法而言,结构更清晰、更简洁、更容易让人从宏观上理解程序的整体结构。
  2. 容易使用数学归纳法证明算法的正确性。

缺点

  1. 由于递归是函数调用函数本身,造成了1+1>2的情况,所以资源占用比其他调用高很多
  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;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值