js递归理解及使用案例

递归在平时开发中会经常用到,递归是一种编程技巧,采取函数调用函数自身的方式工作

下面是递归的特点以及使用案例
一、递归是什么?
递归通俗地讲就是函数自己调用自己,它具有以下三要素

1、一个问题可以分解为更小的问题用同样的方法解决
2、分解后的子问题求解方式一样,不同的是数据规模变小
3、存在递归终止条件

下面看看递归解决实际问题的案例
二、使用案例
1.求1-100的和

//第n项的和 sum(n) = sum(n-1)+n 终止条件n=1
function sum(n){
    if(n==1) return 1
    return sum(n-1) + n
}
let amount = sum(100)
console.log(amount) // 5050

2.求一个数组前n项的和

function arrsum(arr,n){
    if(n==1) return arr[0]
    return arrsum(arr,n-1) + arr[n-1]
}
const arrs = [1,3,4,5,7]
console.log(arrsum(arrs,1))  // 1
console.log(arrsum(arrs,2))  // 4

4.斐波那切数列(又称黄金分割数列\兔子数列)

//1、1、2、3、5、8、13、21、34.....
//规律:自身等于前两项之和;
//(n-1)+(n-2)=n
 
  function fibonacci(n){
      if(n<=2){
           return 1
       }
       return fibonacci(n-1)+fibonacci(n-2)
   }
 console.log(fibonacci(6))   // 8

遍历数组

//数组遍历,使用递归实现
let arr =[1,2,3,4,5,6,7]
function item(arr){
    if(arr.length==0)  return;
    if(arr.length==1){
        return;
    }
    item(item.slice(1))
}
item(arr)

数组扁平化

var sotArr = [56,45,96,77,33,[48,96,13],99,[44,159]];

//普通for...in循环遍历
function flattenArr(arr) {
	let result= [];
	for(let i = 0; i<arr.length;i++) {
		if(Array.isArray([arr[i]])) {
			 result = result.concat(flatten(arr[i]));
		}else {
			result.push(arr[i]);
		}
	}
	return result;
}

//使用高阶函数 reduce 
function flatten(arr) {
    return arr.reduce((prev, item) => {
        return prev.concat(Array.isArray(item) ? flatten(item) : item);
    }, []);
}

// 还可以使用es6的拓展运算符
function flatten(arr) {
    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}

console.log(flattenArr(sotArr));   // [56,45,77,33,48,96,13,44,159]


对象

1.对象属性遍历

在日常的开发中,我们从服务器获取的数据一般都是json格式的,如果对象深度嵌套层级很深的情况下,使用递归是箱单简单的。

var data = {
    id:1,
    name:'幕筱佳',
    info:{
        age:18,
        sex:'男',
        adress:{
            pervice:'某某省'
            city:'某某市'

        }
    }
}
function recursiveObj(obj){
    for(let k in obj){
        if(obj.hasOwnProperty(k)){
            if(typeof obj[k] =='object'){
                recursiveObj(obj[k])
            }else{
                console.log(`${k}:${obj[k]}`)
            }
        }
    }
}
recursiveObj(data)

对象扁平化

function flattenObject(oldObject) {
    const newObject = {};
    flattenHelper(oldObject, newObject, '');
    return newObject;
    
    function flattenHelper(currentObject, newObject, previousKeyName) {
      for (let key in currentObject) {
        let value = currentObject[key];
  
        if (value.constructor !== Object) {
          if (previousKeyName == null || previousKeyName == '') {
            newObject[key] = value;
          } else {
            if (key == null || key == '') {
              newObject[previousKeyName] = value;
            } else {
              newObject[previousKeyName + '.' + key] = value;
            }
          }
        } else {
          if (previousKeyName == null || previousKeyName == '') {
            flattenHelper(value, newObject, key);
          } else {
            flattenHelper(value, newObject, previousKeyName + '.' + key);
          }
        }
      }
    }
  }

对象复制(深拷贝)

function deepCopy(obj) {
    let result = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
     if (obj.hasOwnProperty(key)) {
      if (typeof obj[key] === 'object') {
        result[key] = deepCopy(obj[key]);
      } else {
        result[key] = obj[key];
      }
     }
    }
    return result;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值