笛卡尔积递归

13 篇文章 0 订阅
1 篇文章 0 订阅

笛卡尔积
3个JS版本

版本一 性能好些,

版本二性能差些,

版本三性能和版本1差不多

 

版本一
 递归入参:

array:当前的数组

result:结果集

 递归结束条件:array长度为0

function cartesian(array, result){
        if(array.length === 0){
            return [result]
        }
        let currentResult = []
        const cItem = array[0]
        if(Array.isArray(cItem)){
            for(const i in cItem){
                const res = res.slice()
                res.push(cItem[i])
                currentResult = currentResult.concat(cartesian(array.slice(1), res))
            }
        } else {
            result.push(cItem)
            currentResult = currentResult.concat(cartesian(array.slice(1), result))
        }
        return result
 }

 

版本二
 递归入参:

item: 当前item

array:变化的数组

 递归结束条件:array长度为0

function cartesian(item, array){
    const temp = []
    if (array && array.length > 0) {
        const nextItem = array.shift()
        const res = cartesian(nextItem, array)
        if (!Array.isArray(item)) {
            item = [item]
        }
        for (const i in item) {
            for (const j in res) {
                const ss = res[j].concat()
                ss.unshift(item[i])
                temp.push(ss)
            }
        }
    } else {
        if (!Array.isArray(item)) {
            item = [item]
        }
        for (const i in item) {
            temp.push([item[i]])
        }
    }
    return temp
}

版本三:

递归参数:array

递归结束条件:array长度为0

function cartesian(array){
    const temp = []
    if (array && array.length > 0) {
		let item = array[0]
        const res = cartesian(array.slice(1))
        if (!Array.isArray(item)) {
            item = [item]
        }
		if(res.length === 0){
			for (const i in item) {
				temp.push([item[i]])
        	}
		} else {
			for (const i in item) {
				for(const j in res){
					const temps = res[j].concat()
					temps.unshift(item[i])
					temp.push(temps)
				}
        	}
		}
    }
    return temp
}

检测:

const obj = {
    12:3,
    23:[2,3],
    34:0
}
console.time('testTime1')
const arr = Object.values(obj)
const res = cartesian(arr)
console.log(res)
console.timeEnd('testTime1')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值