js递归与应用

本文介绍了JavaScript中的递归概念,包括直接调用和间接调用,并通过斐波那契数列和对象深浅克隆的实例展示了递归的使用。递归在解决复杂问题时能够简化代码,文中提供的代码示例详细解释了如何实现递归函数。同时,还探讨了如何进行对象的深克隆和浅克隆,帮助读者理解数据类型的复制和引用。
摘要由CSDN通过智能技术生成

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;
            }
   }

效果如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值