未知长度的二维数组计算笛卡尔积 - JS实现

const a = [1,2,3]

const b = ["a","b","c"]

const c =["z","y"]

const d =["*","^","%"]

如求以上四个数组(或更多)的笛卡尔积,思路是先将第一个数组作为结果, 再通过该结果与第二个数组交叉,得到的结果再与第三个数组交叉,依此直到与最后一个数组交叉完成。

此算法可以通过递归或循环实现,因为递归会消耗栈空间,深度越大消耗越大,甚至导致内存溢出,所以我选用的循环实现。

function x(){
    const a = [1,2,3]
    const b = ["a","b","c"]
    const c =["z","y"]
    const d =["*","^","%"]

    const t =[a,b,c,d] 
    
    let result=[]
    for(let i=0;i<t[0].length;i++)
        result.push([t[0][i]])
    console.log(result,"初始化Result")

    for(let j=0;j<t.length;j++){
        let nextIndex = j+1
        if(nextIndex>=t.length)
            continue 
        let temp=[]
        for(let k=0; k<result.length;k++){
            for(let l=0;l<t[nextIndex].length;l++){
                temp.push(result[k].concat(t[nextIndex][l]))
            }
        }
        result = temp
        console.log(result,`第${j+1}次结果:`,result.length+"条")
    }
}
x()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值