
1,1,2,3,5,8,13,21,34,55,89...求第 n 项
JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法
原理: clone(o) = new Object返回一个对象
1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。
2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。
3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。
4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他 *** 作。
5、递归实现的快速排序比普通遍历实现的排序效率更好。
首先,有关【递归】的知识请参考上一节,链接地址:
【上一篇】:带你刷LeetCode中的递归算法
根据JS中【栈】的知识,我们知道js的基本数据类型是值引用,引用类型是地址引用。在浅拷贝中引用的地址同一个地址引用,修改其中一个对象的属性值,另一个对象也会产生影响;而在深拷贝中,会开辟一个新的内存地址用来存放新对象的值,两个对象对应引用的内存地址不一样 ,修改一个对象并不会对另外一个对象产生影响。更详细的描述请参考关于【栈】的介绍。
【栈】:JS版数据结构-栈
一个新的对象直接拷贝已存在的对象的对象属性的引用,即浅拷贝。
对于以上两个拷贝,obj中的name是基本数据类型,浅拷贝可以直接赋值得到,msg是个对象,是复杂数据类型,对象会开辟一个新的内存空间存储msg对象,浅拷贝的时候时拷贝的地址是同一个地址。此时改变obj中的txt中的值,o中的txt的值也会改变。
对于数组的拷贝,可以利用数组原型上内置的slice方法。
数组合并也是一个浅拷贝。
深拷贝会另外拷贝一份一个一模一样的对象,从堆内存中开辟一个新的区域存放新对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
简单说:深拷贝把存放对象的空间地址,再复制一份给新对象,这样两个对象直接互不干扰。
基于基本数据类型直接循环复制,对于复杂数据类型再次运用for循环 *** 作,每一级都要循环拷贝。我们可以使用递归,对于遇到对象再次调用for循环即可。
下一篇:JS中的算法.排序
推荐阅读:
1. JS. 类
2. JS. 构造函数
3. JS中对象原型 proto 及原型链
4. JS. 构造函数的原型 prototype
首先先解释一下什么是递归函数:什么是递归方法:就是一个方法,自己调用自己
但是一定要注意控制好合适的跳出,不然就会死循环,如图:
所以我们平时一定要注意,递归函数里调用函数本身的时候一定要要合理的控制循环跳出的语句;比如我们来看一题很经典的面试题,请用递归方法算出1-20之间每个数的和
function calc(num){
//这个if是退出递归的条件
if(num===1) { //如果没有这个if条件
return num
}
return num + calc(num-1) //
}
console.log(calc(3)) //这里为了方便我们理解我们可以先用num===3替代进去,具体的方式以及步骤分解可以看图:
如果有大佬有更好的理解方法,可以留言或者私信哦,互相学习,互相进步~~~
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)